Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос про заголовочные файлы
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Student Pupkin
 Есть пара вопросов...
Как начинающий ембедер взял для учебных целей пару проектов своих старших по цеху коллег. Один проект на си, другой на асме. unsure.gif
  1. В проекте на си увидел следующее - имеется несколько СИ-файлов (допустим 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 подключить первый, а в остальных модулях - второй файл? Или как? Или же способ моего старшего коллеги тоже к дурному стилю не относится?  laughing.gif
  2. В проекте на асме увидел только один здоровенный ассемблерный файл и несколько h-файлов. Самым интересным оказалось то, что в ассемблерном файле код не весь, оставшуюся часть (кучку подпрограмм) я нашел спрятанной в одном из h-файлов... blink.gif
    Полагаю это можно отнести к "плохому тону" в оформлении программы?

Вот... Просто хочется научиться правильно оформлять программы, привить себе хороший стиль в написании и оформлении кода smile3046.gif ... Чтобы если придется в команде работать - в грязь лицом не ударить, не показаться невеждой... 01.gif    
Гуру! Наставьте на путь истиный!!!
aaarrr
Цитата(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-файлов... blink.gif
Полагаю это можно отнести к "плохому тону" в оформлении программы?

Код в хидере, так же как приляпывание "C"-файлов при помощи #inculde, ИМХО, кошмар.
zltigo
Цитата(aaarrr @ Apr 13 2009, 21:22) *
Код в хидере, так же как приляпывание "C"-файлов при помощи #inculde, ИМХО, кошмар.

Несомненно. Бывают, конечно, исключения, но редко.
singlskv
Цитата(aaarrr @ Apr 13 2009, 23:22) *
Переменные в заголовочный файл помещать не следует.
А если она объявлена как register(независимо от того зарезервирован ли будет под нее регистр проца), тогда можно ?
Автор топика не читайте это smile.gif , это не совет laughing.gif
MrYuran
Я обычно в h-файл модуля выношу то, что нужно видеть "снаружи", то есть прототипы функций, вызываемых извне и extern объявления переменных, которые могут быть использованы другими модулями. Не знаю, насколько это правильно, но мне кажется удобно.
Подключая h-файл, сразу включаешь необходимый набор переменных и функций.
BSVi
Сам смысл модулей в том, чтобы скрыть внутренюю функциональность от других модулей, а во вне предоставить нейкий интерфейс, который и должен быть обьявлен в заголовочном файле.

Таким образом - все функции, которые используются только внутри модуля обьявляются как static, остальные выносятся в заголовочный файл.
внимание, в заголовках нельзя обьявлть переменные. кроме констант. Глобальные переменные (если в них действительно есть необходисоть) лучше сделать отдельным модулем global_vars.c и global_vars.h

Сам смысл модулей в том, чтобы скрыть внутренюю функциональность от других модулей, а во вне предоставить нейкий интерфейс, который и должен быть обьявлен в заголовочном файле.

Таким образом - все функции, которые используются только внутри модуля обьявляются как static, остальные выносятся в заголовочный файл.
внимание, в заголовках нельзя обьявлть переменные. кроме констант. Глобальные переменные (если в них действительно есть необходисоть) лучше сделать отдельным модулем global_vars.c и global_vars.h
aaarrr
Цитата(singlskv @ Apr 14 2009, 00:59) *
А если она объявлена как register(независимо от того зарезервирован ли будет под нее регистр проца), тогда можно ?

??? Тогда тем более нельзя: если переменная объявлена как register, то она автоматически не может быть глобальной.
singlskv
Цитата(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

И регистровая переменная становится глобальной...
aaarrr
Все это, конечно, хорошо, только вот к ANSI C отношения уже не имеет.
dxp
Цитата(zltigo @ Apr 14 2009, 02:25) *
Несомненно. Бывают, конечно, исключения, но редко.

Код в заголовочном файле для С++ является нормой.
zltigo
Цитата(dxp @ Apr 16 2009, 05:48) *
Код в заголовочном файле для С++ является нормой.

Много, что есть в C++ разного. Речь в топике о 'C'.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.