Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Firefox от Апрель 26, 2016, 22:22



Название: подключение "* .с" файлов
Отправлено: Firefox от Апрель 26, 2016, 22:22
Здравствуйте. Хочу задать вам вопрос. У меня есть файл драйвера "*.с". Устройство для которого написан этот драйвер может работать в 3-х режимах. В одной программе я создаю 3 класса(каждый отдльным потоком), которые берут функции из файла драйвера. в файле драйвера есть глобальные  переменные. Подключаю в .срр файлы классов файл драйвера как
Код:
extern "C"
{
#include "*.c"
}
выводится много ошибок при сборке из-за множественного подключения файла драйвера, если в одном классе только - то все хорошо. Подскажите как можно правильно подключить файл, чтобы функции были доступны во всех классах. Переписывать файл, чтобы сделать *.h +*.cpp можно, но может можно как-то не меня файл драйвера и не запихивая все нужные мне действия в один класс?


Название: Re: подключение "* .с" файлов
Отправлено: ssoft от Апрель 27, 2016, 07:54
Нужно сформировать заголовочный файл "*.h" соответствующий "*.с" и собирать обычным образом. И ни как уж не нужно включать "*.c" в "*.cpp" через #include, нужно включать "*.h".

Код
C++ (Qt)
#include "driver.h"
 

А в заголовке "driver.h"
Код
C++ (Qt)
extern "C"
{
   // function declaration list
   // ...
}
 


Название: Re: подключение "* .с" файлов
Отправлено: Firefox от Апрель 27, 2016, 08:25
Это очень геморно, легче один класс тогда сделать с входными параметрами и в нем в зависимости от параметра обработку делать разную, а файл будет подключен один раз.


Название: Re: подключение "* .с" файлов
Отправлено: Igors от Апрель 27, 2016, 09:14
Это очень геморно, легче один класс тогда сделать с входными параметрами и в нем в зависимости от параметра обработку делать разную, а файл будет подключен один раз.
Что-то Вы не то мудрите. Причем тут Ваш класс(ы)? Нужно подключить C ф-ции, они так или иначе объявлены в файле .h. Вот и проследите чтобы объявления там были окружены extern "С" - и все дела. Это указывает компилятору что имена ф-ций/переменных должно сохраняться в изначальном виде. А если исходные С файлы у Вас на руках, то просто компилируйте их как С++


Название: Re: подключение "* .с" файлов
Отправлено: Firefox от Апрель 27, 2016, 10:39
Файла h нет. Там не класс а просто функции объявленные в том же файле как глобальные.


Название: Re: подключение "* .с" файлов
Отправлено: Firefox от Апрель 27, 2016, 10:41
Отсюда и проблема, как я понимаю,  получается что эти функции при подключении несколько раз к моим файлам дают  multiple definition.


Название: Re: подключение "* .с" файлов
Отправлено: Igors от Апрель 27, 2016, 11:31
Отсюда и проблема, как я понимаю,  получается что эти функции при подключении несколько раз к моим файлам дают  multiple definition.
Конечно будет multiple. Вообще странно что нет .h (как без него работал .с ?). Ну ладно, делайте .h файл, процесс примерно такой: создаете .h (см пост ssoft) и добавляете в исходники где он нужен. Компилите - вякнет что нет каких-то ф-ций. Находите их в .c файле и прототип (объявление) копируете в h файл. Это займет немного времени, не ищите "чего-то особенного" 


Название: Re: подключение "* .с" файлов
Отправлено: Firefox от Апрель 27, 2016, 12:07
На мой взгляд нет ничего странного. В с классов нет, потому какая разница где объявить функции, они будут в глобальной области если не объявлена как static.


Название: Re: подключение "* .с" файлов
Отправлено: lit-uriy от Апрель 27, 2016, 12:26
> В с классов нет
это совершенно не важно, в Си++ не обязательно классы описывать.

>потому какая разница где объявить функции
большая, сами по себе они (функции) не нужны, нужны только если их использовать в других частях программы, а чтобы их туда добавить, нужно объявление, которое и помещают в заголовочник, а определения функций помещают в Си-файл, который никуда не инклюдится. Таким образом достигается объявление функций (классов, структур и т.п.) в конкретных местах использования, но избегается появления в нескольких местах определения одних и тех же функций.

Т.е. всё тоже самое, как и с классами, структурами и пр. ни какой разницы, в данном случае, между Си и Си++ нет.


Название: Re: подключение "* .с" файлов
Отправлено: Firefox от Апрель 27, 2016, 12:31
Попробую, хотя сейчас и так работает ( если один класс сделать и туда подключить ".  с" файл).


Название: Re: подключение "* .с" файлов
Отправлено: lit-uriy от Апрель 27, 2016, 12:38
а ты не делай классов, просто подключи в 2 Си-файла и получишь от линкера сообщение "Множественное определение".


Название: Re: подключение "* .с" файлов
Отправлено: lit-uriy от Апрель 27, 2016, 12:42
при разделении на заголовочник и исходник, не забудь добавить Си-файл драйвера в проект.
т.е. у тебя получится
* driver.o - объектник, в котором код функций драйвера и определение этих функций
* myfile.o - объектник в котором твой код и ссылка на функции драйвера, которые линкер свяжет с функциями из  driver.o.


Название: Re: подключение "* .с" файлов
Отправлено: Igors от Апрель 27, 2016, 13:25
... какая разница где объявить функции, они будут в глобальной области если не объявлена как static.
Ладно, пожуем азы. Есть предварительное описание и полное.
Код
C++ (Qt)
void MyFunc( int ); // предварительное (прототип)
...
void MyFunc( int )   // полное (тело)
{
}
Предварительных описаний может быть сколько угодно и в любом месте,  но все они должны точно совпадать. Полное описание - одно и только одно, иначе "multiple". В "С" прототипы не требовались, мол, "линкер и так найдет", и из-за этого возникало множество бед. Поэтому в С++ первое что сделали - каждая ф-ция должна иметь прототип.  
... хотя сейчас и так работает ( если один класс сделать и туда подключить ".  с" файл).
Да, если полное описание (тело) есть выше в том же файле (единице трансляции), то предварительное не требуется. Но так Вы привязаны к одному файлу (что уже ощутили).

На мой взгляд нет ничего странного. В с классов нет, потому ..
Конечно Вы имеете право на собственное мнение :) Но лучше сначала сделать грамотно, как положено, а там глядишь - и мнение изменится  :)


Название: Re: подключение "* .с" файлов
Отправлено: Firefox от Апрель 27, 2016, 16:09
Спасибо. Стало более понятно.


Название: Re: подключение "* .с" файлов
Отправлено: stetsenko от Май 10, 2016, 23:08
ну слава богу