|
|
  |
Вопрос про заголовочные файлы, и хороший стиль программирования |
|
|
|
Apr 13 2009, 19:15
|
Местный
  
Группа: Участник
Сообщений: 328
Регистрация: 23-05-08
Пользователь №: 37 760

|
Есть пара вопросов...
Как начинающий ембедер взял для учебных целей пару проектов своих старших по цеху коллег. Один проект на си, другой на асме. - В проекте на си увидел следующее - имеется несколько СИ-файлов (допустим module_1.c, module_2.c, main.c) и несколько h-файлов.Отдельно для каждого модуля (кроме main.c) имеется h-файл с объявлениями функций (module_1.h, module_2.h), включаемый в соответствующем модуле. Также есть h-файлы, где объявлены глобальные переменные (допустим global_var.h). Эти переменные используются функциями некоторых модулей, но в тексте самих модулей соответствующей директивы о подключении этих h-файлов нет.
И все это хозяйство выглядит таким образом:
Код // файл module_1.c #include "module_1.h" // далее определения функций, которые используют переменные,описанные в global_var.h
Код // файл module_2.c #include "module_2.h" // далее определения функций, которые используют переменные, описанные в global_var.h
Код // файл main.c #include "global_var.h" #include "module_1.c" #include "module_2.c" // далее main.... Но я думал, что по общепринятым правилам следовало в одном из модулей обявить все эти глобальные переменные обычным образом, а в остальных - с квалификатором extern... Правда не знаю, как правильней следует делать - создать два заголовочных файла, global_var.h и global_var_extern.h? А потом в main.c подключить первый, а в остальных модулях - второй файл? Или как? Или же способ моего старшего коллеги тоже к дурному стилю не относится? - В проекте на асме увидел только один здоровенный ассемблерный файл и несколько h-файлов. Самым интересным оказалось то, что в ассемблерном файле код не весь, оставшуюся часть (кучку подпрограмм) я нашел спрятанной в одном из h-файлов...
Полагаю это можно отнести к "плохому тону" в оформлении программы?
Вот... Просто хочется научиться правильно оформлять программы, привить себе хороший стиль в написании и оформлении кода  ... Чтобы если придется в команде работать - в грязь лицом не ударить, не показаться невеждой... Гуру! Наставьте на путь истиный!!!
|
|
|
|
|
Apr 13 2009, 19:22
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Student Pupkin @ Apr 13 2009, 23:15)  Правда не знаю, как правильней следует делать - создать два заголовочных файла, global_var.h и global_var_extern.h? А потом в main.c подключить первый, а в остальных модулях - второй файл? Или как? А зачем два? Объявить глобальные переменные в одном модуле, и сделать хидер с extern'ами. Переменные в заголовочный файл помещать не следует. Цитата(Student Pupkin @ Apr 13 2009, 23:15)  Самым интересным оказалось то, что в ассемблерном файле код не весь, оставшуюся часть (кучку подпрограмм) я нашел спрятанной в одном из h-файлов... Полагаю это можно отнести к "плохому тону" в оформлении программы? Код в хидере, так же как приляпывание "C"-файлов при помощи #inculde, ИМХО, кошмар.
|
|
|
|
|
Apr 13 2009, 19:25
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(aaarrr @ Apr 13 2009, 21:22)  Код в хидере, так же как приляпывание "C"-файлов при помощи #inculde, ИМХО, кошмар. Несомненно. Бывают, конечно, исключения, но редко.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 14 2009, 06:36
|
Частый гость
 
Группа: Свой
Сообщений: 76
Регистрация: 18-12-07
Из: Киев
Пользователь №: 33 391

|
Сам смысл модулей в том, чтобы скрыть внутренюю функциональность от других модулей, а во вне предоставить нейкий интерфейс, который и должен быть обьявлен в заголовочном файле.
Таким образом - все функции, которые используются только внутри модуля обьявляются как static, остальные выносятся в заголовочный файл. внимание, в заголовках нельзя обьявлть переменные. кроме констант. Глобальные переменные (если в них действительно есть необходисоть) лучше сделать отдельным модулем global_vars.c и global_vars.h
Сам смысл модулей в том, чтобы скрыть внутренюю функциональность от других модулей, а во вне предоставить нейкий интерфейс, который и должен быть обьявлен в заголовочном файле.
Таким образом - все функции, которые используются только внутри модуля обьявляются как static, остальные выносятся в заголовочный файл. внимание, в заголовках нельзя обьявлть переменные. кроме констант. Глобальные переменные (если в них действительно есть необходисоть) лучше сделать отдельным модулем global_vars.c и global_vars.h
--------------------
|
|
|
|
|
Apr 14 2009, 23:28
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(aaarrr @ Apr 14 2009, 12:01)  ??? Тогда тем более нельзя: если переменная объявлена как register, то она автоматически не может быть глобальной. Это конечно как бы так... Но вот Вам примеры IAR AVR: main.hКод #ifndef main_h #define main_h
__regvar __no_init unsigned char reg15 @ 15;
extern void foo();
#endif main.cКод #include "main.h"
volatile unsigned char A;
int main( void ) { reg15 = 1; A = reg15; foo(); return 0; } foo.cКод #include "main.h"
volatile unsigned char B;
void foo() { B = reg15; } А для Gcc: main.hКод #ifndef main_h #define main_h
register unsigned char reg15 asm("r15");
extern void foo();
#endif И регистровая переменная становится глобальной...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|