Где я могу поместить все эти функции, как #defines, в C? - PullRequest
8 голосов
/ 12 марта 2010

Я работаю со встроенной системой, и в итоге получаю тонну макросов HW-interfacing #define. Я хочу поместить все это в отдельный файл (для ООП), но я не знаю, как лучше всего это сделать. Должен ли я просто поместить их все в файл .c, а затем включить это? Кажется глупым помещать их в файл .h.

Ответы [ 4 ]

13 голосов
/ 12 марта 2010

Я не вижу ничего плохого в .h файле.

7 голосов
/ 12 марта 2010

Они должны быть в файлах .h. Другой вариант - файл .c, и для этого потребуется использовать #include для включения файла .c, что очень определенно запутает людей, а также запутает ваш make-файл, если он использует стандартное предположение, что каждый * Файл 1005 * будет напрямую соответствовать скомпилированному файлу .o.

Обычный шаблон таков: .h файлы предназначены для вещей, которые включены в другие места (и, в частности, во многих других местах), и что .c файлы предназначены для вещей, которые однажды скомпилированы в объектные файлы.

Таким образом, в файлы .h обычно входят следующие вещи:

  • Функциональные прототипы
  • декларации констант
  • Глобальная переменная extern объявления
  • Определения встроенных функций
  • Определения типов
  • и определения макросов, например, о чем вы спрашиваете.

И наоборот, в файлы .c обычно входят следующие вещи:

  • Определения глобальных переменных
  • Определения функций, которые будут скомпилированы в объектный код и связаны

Случай «определения функций входят только в .c файлы» - это просто вырожденный случай, когда у вас нет встроенных функций.

В C ++, где множество функций определены в шаблонной форме и, следовательно, определения должны включаться всякий раз, когда они используются, эти определения очень часто помещаются в файл .h (или .hpp, или любой другой). Так что подобные вещи, безусловно, имеют прецедент.

2 голосов
/ 13 апреля 2010

Разместите их там, где они вам нужны.

Если вам нужен только один файл, поместите его в начало этого файла.

Если вам это нужно для нескольких файлов, поместите его в заголовочный файл.

2 голосов
/ 12 марта 2010

Я не обязательно рекомендую это, но видел это в довольно многих встроенных проектах за последние 10 с лишним лет: включайте встроенные функции как .inl.

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

#include "prototypes.h"
#include "macros.inl"

int foo(void);
int bar(char);

Ваша конечная цель - последовательность: любые решения о компоновке должны помочь тем, кто вас сменит.

...