|
|
  |
Как подключаются h и с файлы, Чтото не все понятно. |
|
|
|
Oct 20 2005, 14:15
|
Участник

Группа: Свой
Сообщений: 47
Регистрация: 12-07-05
Пользователь №: 6 725

|
Оставь один раз #includ "const.h" в main.c
|
|
|
|
|
Oct 20 2005, 20:19
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
1. Используйте условную компиляцию. Т.е. конструкцию типа Код #ifndef _I_CONST_DEF ... #define _I_CONST_DEF 1 #endif 2. Все функции описывайте в главном хидере проекта с помощью определения externКод extern unsigned int MyFunc (void) и включайте главный хидер во все файлы проекта, где используются эти функции.
|
|
|
|
|
Oct 21 2005, 06:03
|

Местный
  
Группа: Свой
Сообщений: 263
Регистрация: 7-10-05
Из: UA
Пользователь №: 9 342

|
Цитата(Serega Doc @ Oct 20 2005, 16:00) Есть main.c и proc.c в const.h объявляю константы и дефайны Что понимается под "константами" в const.h? Если собственно объявление и инициализация констант, типа Код // in "const.h": const int SomeConst=0x55AA; то конечно линкер будет ругаться, т.к. при сборке окажется что SomeConst определена во всех файлах, куда включен const.h. Более правильно объявить константу в хедере: Код // in "const.h": extern const int SomeConst; а определить и инициализировать ее в одном из *.C-файлов: Код // in "proc.c": const int SomeConst=0x55AA; Тогда компилятор при компиляции всех файлов, куда включен const.h, будет знать, что SomeConst где-то определено, будет знать его тип, а собственно память под SomeConst выделит только в proc.c. А линкер уже потом разберется что к чему, и ссылки на SomeConst из всех объектников привяжет к единому месту. Вообще, есть такое общее правило: в заголовочных файлах *.h помещать только объявления, т.е. то, что не порождает код и не вызывает выделения памяти.
--------------------
Gray©at
|
|
|
|
|
Oct 24 2005, 07:33
|

Местный
  
Группа: Свой
Сообщений: 263
Регистрация: 7-10-05
Из: UA
Пользователь №: 9 342

|
Цитата(IgorKossak @ Oct 24 2005, 08:50) Цитата(GrayCat @ Oct 21 2005, 09:03) ...Вообще, есть такое общее правило: в заголовочных файлах *.h помещать только объявления, т.е. то, что не порождает код и не вызывает выделения памяти. Чего не скажешь о С++, например, где в хедерах обьявляются классы. А это иногда весьма неслабая часть кода.! Насколько я ничего не понимаю в Ц++, объявление классов память никак не выделяет. Это происходит только при создании экземпляров класса, что выполняется уже в *.C-файлах.
--------------------
Gray©at
|
|
|
|
|
Oct 24 2005, 07:44
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(GrayCat @ Oct 24 2005, 10:33) Насколько я ничего не понимаю в Ц++, объявление классов память никак не выделяет. Это происходит только при создании экземпляров класса, что выполняется уже в *.C-файлах. Я имел в виду не выделение памяти, а порождение кода. Особенно когда методы класса являются встроенными (инлайновыми). Или когда применяются шаблоны функций, тело которых иначе как в хедерах и не обьявишь.
|
|
|
|
|
Oct 24 2005, 07:55
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Никто почему-то не расскажет ещё об одной технике обьявления/определения переменных в хедерах. Помимо охранных констант, исключающих повторное включение файла иногда бывает удобно в одном файле и определять и обьявлять переменные (экземпляры класса). Код #ifndef _xxx_DEF ... unsigned int My_Int_Var; ... #else ... extern unsigned int My_Int_Var; ... #endif Константа _xxx_DEF обьявляется только в одном файле *.c, где происходит выделение под них памяти. Все же остальные файлы включающие данный хедер, будут видеть только обьявления. При желании можно написать макрос, который сделает всё это автоматически.
|
|
|
|
|
Oct 25 2005, 07:02
|

Местный
  
Группа: Свой
Сообщений: 263
Регистрация: 7-10-05
Из: UA
Пользователь №: 9 342

|
Цитата(rezident @ Oct 24 2005, 16:55) IgorKossak, понятно что это можно, но для чего это нужно?  Если не трудно, то приведите пример из практики где было обосновано такое объявление глобальных переменных? Ну, например, такая техника удобна тем, что объявление и определение переменной оказываются "близко" друг к другу (в пределах 3-х строк), и при необходимости модификации ее типа или имени изменения быстро вносятся в обе строки. При обычном "разнесении" переменной в .h и .c приходится открывать 2 файла и в них выискивать нужные места. Но я лично предпочитаю традиционный вариант
--------------------
Gray©at
|
|
|
|
|
Oct 25 2005, 17:35
|

Знающий
   
Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095

|
Цитата(IgorKossak @ Oct 24 2005, 10:55) Никто почему-то не расскажет ещё об одной технике обьявления/определения переменных в хедерах. Помимо охранных констант, исключающих повторное включение файла иногда бывает удобно в одном файле и определять и обьявлять переменные (экземпляры класса). Код #ifndef _xxx_DEF ... unsigned int My_Int_Var; ... #else ... extern unsigned int My_Int_Var; ... #endif Константа _xxx_DEF обьявляется только в одном файле *.c, где происходит выделение под них памяти. Все же остальные файлы включающие данный хедер, будут видеть только обьявления. При желании можно написать макрос, который сделает всё это автоматически. Здесь ИМХО ошибка вкралась, вместо Код #ifndef _xxx_DEF нужно Код #ifdef _xxx_DEF по крайней мере так работает...
|
|
|
|
|
Oct 26 2005, 12:33
|

Частый гость
 
Группа: Свой
Сообщений: 146
Регистрация: 4-11-04
Из: Московская область
Пользователь №: 1 040

|
Цитата(Old1 @ Oct 25 2005, 20:35) Здесь ИМХО ошибка вкралась, #ifndef _xxx_DEF ... unsigned int My_Int_Var; ... #else ... extern unsigned int My_Int_Var; ... #endif[/code] Константа _xxx_DEF обьявляется только в одном файле *.c, где происходит выделение под них памяти.Здесь ИМХО ошибка вкралась, вместо Код #ifndef _xxx_DEF нужно Код #ifdef _xxx_DEF по крайней мере так работает... А я так понял , что Игорь прав. Те если не было определено неадера _xxx_DEF с переменной unsigned int My_Int_Var - создать ее у себя. А если был определен( те файл определений подключен к проекту) - использовать оттудова.
--------------------
- ЗАМЕНЯТЬ ДЕТАЛИ НА ХОДУ ВОСПРЕЩАЕТСЯ !!! -
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|