Название: подключение "* .с" файлов Отправлено: Firefox от Апрель 26, 2016, 22:22 Здравствуйте. Хочу задать вам вопрос. У меня есть файл драйвера "*.с". Устройство для которого написан этот драйвер может работать в 3-х режимах. В одной программе я создаю 3 класса(каждый отдльным потоком), которые берут функции из файла драйвера. в файле драйвера есть глобальные переменные. Подключаю в .срр файлы классов файл драйвера как
Код: extern "C" Название: Re: подключение "* .с" файлов Отправлено: ssoft от Апрель 27, 2016, 07:54 Нужно сформировать заголовочный файл "*.h" соответствующий "*.с" и собирать обычным образом. И ни как уж не нужно включать "*.c" в "*.cpp" через #include, нужно включать "*.h".
Код
А в заголовке "driver.h" Код
Название: 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. Ладно, пожуем азы. Есть предварительное описание и полное. Код Предварительных описаний может быть сколько угодно и в любом месте, но все они должны точно совпадать. Полное описание - одно и только одно, иначе "multiple". В "С" прототипы не требовались, мол, "линкер и так найдет", и из-за этого возникало множество бед. Поэтому в С++ первое что сделали - каждая ф-ция должна иметь прототип. ... хотя сейчас и так работает ( если один класс сделать и туда подключить ". с" файл). Да, если полное описание (тело) есть выше в том же файле (единице трансляции), то предварительное не требуется. Но так Вы привязаны к одному файлу (что уже ощутили). На мой взгляд нет ничего странного. В с классов нет, потому .. Конечно Вы имеете право на собственное мнение :) Но лучше сначала сделать грамотно, как положено, а там глядишь - и мнение изменится :)Название: Re: подключение "* .с" файлов Отправлено: Firefox от Апрель 27, 2016, 16:09 Спасибо. Стало более понятно.
Название: Re: подключение "* .с" файлов Отправлено: stetsenko от Май 10, 2016, 23:08 ну слава богу
|