реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Вопрос про заголовочные файлы, и хороший стиль программирования
Student Pupkin
сообщение Apr 13 2009, 19:15
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 328
Регистрация: 23-05-08
Пользователь №: 37 760



 Есть пара вопросов...
Как начинающий ембедер взял для учебных целей пару проектов своих старших по цеху коллег. Один проект на си, другой на асме. 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    
Гуру! Наставьте на путь истиный!!!
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 13 2009, 19:22
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 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-файлов... blink.gif
Полагаю это можно отнести к "плохому тону" в оформлении программы?

Код в хидере, так же как приляпывание "C"-файлов при помощи #inculde, ИМХО, кошмар.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 13 2009, 19:25
Сообщение #3


Гуру
******

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



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

Несомненно. Бывают, конечно, исключения, но редко.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
singlskv
сообщение Apr 13 2009, 20:59
Сообщение #4


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(aaarrr @ Apr 13 2009, 23:22) *
Переменные в заголовочный файл помещать не следует.
А если она объявлена как register(независимо от того зарезервирован ли будет под нее регистр проца), тогда можно ?
Автор топика не читайте это smile.gif , это не совет laughing.gif
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Apr 14 2009, 04:31
Сообщение #5


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Я обычно в h-файл модуля выношу то, что нужно видеть "снаружи", то есть прототипы функций, вызываемых извне и extern объявления переменных, которые могут быть использованы другими модулями. Не знаю, насколько это правильно, но мне кажется удобно.
Подключая h-файл, сразу включаешь необходимый набор переменных и функций.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
BSVi
сообщение Apr 14 2009, 06:36
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 76
Регистрация: 18-12-07
Из: Киев
Пользователь №: 33 391



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

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

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

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


--------------------
http://bsvi.ru/ - блог эмбеддера
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 14 2009, 08:01
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(singlskv @ Apr 14 2009, 00:59) *
А если она объявлена как register(независимо от того зарезервирован ли будет под нее регистр проца), тогда можно ?

??? Тогда тем более нельзя: если переменная объявлена как register, то она автоматически не может быть глобальной.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Apr 14 2009, 23:28
Сообщение #8


дятел
*****

Группа: Свой
Сообщений: 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

И регистровая переменная становится глобальной...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 15 2009, 07:22
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Все это, конечно, хорошо, только вот к ANSI C отношения уже не имеет.
Go to the top of the page
 
+Quote Post
dxp
сообщение Apr 16 2009, 03:48
Сообщение #10


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(zltigo @ Apr 14 2009, 02:25) *
Несомненно. Бывают, конечно, исключения, но редко.

Код в заголовочном файле для С++ является нормой.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 16 2009, 06:06
Сообщение #11


Гуру
******

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



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

Много, что есть в C++ разного. Речь в топике о 'C'.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 15:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01538 секунд с 7
ELECTRONIX ©2004-2016