Russian Qt Forum
Ноябрь 27, 2024, 08:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: подключение "* .с" файлов  (Прочитано 8806 раз)
Firefox
Гость
« : Апрель 26, 2016, 22:22 »

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

Сообщений: 584


Просмотр профиля
« Ответ #1 : Апрель 27, 2016, 07:54 »

Нужно сформировать заголовочный файл "*.h" соответствующий "*.с" и собирать обычным образом. И ни как уж не нужно включать "*.c" в "*.cpp" через #include, нужно включать "*.h".

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

А в заголовке "driver.h"
Код
C++ (Qt)
extern "C"
{
   // function declaration list
   // ...
}
 
Записан
Firefox
Гость
« Ответ #2 : Апрель 27, 2016, 08:25 »

Это очень геморно, легче один класс тогда сделать с входными параметрами и в нем в зависимости от параметра обработку делать разную, а файл будет подключен один раз.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Апрель 27, 2016, 09:14 »

Это очень геморно, легче один класс тогда сделать с входными параметрами и в нем в зависимости от параметра обработку делать разную, а файл будет подключен один раз.
Что-то Вы не то мудрите. Причем тут Ваш класс(ы)? Нужно подключить C ф-ции, они так или иначе объявлены в файле .h. Вот и проследите чтобы объявления там были окружены extern "С" - и все дела. Это указывает компилятору что имена ф-ций/переменных должно сохраняться в изначальном виде. А если исходные С файлы у Вас на руках, то просто компилируйте их как С++
Записан
Firefox
Гость
« Ответ #4 : Апрель 27, 2016, 10:39 »

Файла h нет. Там не класс а просто функции объявленные в том же файле как глобальные.
Записан
Firefox
Гость
« Ответ #5 : Апрель 27, 2016, 10:41 »

Отсюда и проблема, как я понимаю,  получается что эти функции при подключении несколько раз к моим файлам дают  multiple definition.
« Последнее редактирование: Апрель 27, 2016, 10:52 от Firefox » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Апрель 27, 2016, 11:31 »

Отсюда и проблема, как я понимаю,  получается что эти функции при подключении несколько раз к моим файлам дают  multiple definition.
Конечно будет multiple. Вообще странно что нет .h (как без него работал .с ?). Ну ладно, делайте .h файл, процесс примерно такой: создаете .h (см пост ssoft) и добавляете в исходники где он нужен. Компилите - вякнет что нет каких-то ф-ций. Находите их в .c файле и прототип (объявление) копируете в h файл. Это займет немного времени, не ищите "чего-то особенного" 
Записан
Firefox
Гость
« Ответ #7 : Апрель 27, 2016, 12:07 »

На мой взгляд нет ничего странного. В с классов нет, потому какая разница где объявить функции, они будут в глобальной области если не объявлена как static.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #8 : Апрель 27, 2016, 12:26 »

> В с классов нет
это совершенно не важно, в Си++ не обязательно классы описывать.

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

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

Юра.
Firefox
Гость
« Ответ #9 : Апрель 27, 2016, 12:31 »

Попробую, хотя сейчас и так работает ( если один класс сделать и туда подключить ".  с" файл).
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #10 : Апрель 27, 2016, 12:38 »

а ты не делай классов, просто подключи в 2 Си-файла и получишь от линкера сообщение "Множественное определение".
Записан

Юра.
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #11 : Апрель 27, 2016, 12:42 »

при разделении на заголовочник и исходник, не забудь добавить Си-файл драйвера в проект.
т.е. у тебя получится
* driver.o - объектник, в котором код функций драйвера и определение этих функций
* myfile.o - объектник в котором твой код и ссылка на функции драйвера, которые линкер свяжет с функциями из  driver.o.
Записан

Юра.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Апрель 27, 2016, 13:25 »

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

На мой взгляд нет ничего странного. В с классов нет, потому ..
Конечно Вы имеете право на собственное мнение Улыбающийся Но лучше сначала сделать грамотно, как положено, а там глядишь - и мнение изменится  Улыбающийся
Записан
Firefox
Гость
« Ответ #13 : Апрель 27, 2016, 16:09 »

Спасибо. Стало более понятно.
Записан
stetsenko
Гость
« Ответ #14 : Май 10, 2016, 23:08 »

ну слава богу
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.2 секунд. Запросов: 23.