Где я могу поместить все эти функции, как #defines, в C?
Я работаю со встроенной системой, и я заканчиваю с тонной HW-интерфейса #define
макросы. Я хочу поместить все это в отдельный файл (для ООП), но я не знаю лучший способ #include
тот. Должен ли я просто поместить их все в файл.c, а затем включить это? Кажется глупым помещать их в файл.h.
4 ответа
Это должно идти в .h
файлы. Другой вариант - это .c
файл, и это потребует использования #include
включить .c
файл, который очень определенно запутает людей, а также запутает ваш make-файл, если он использует стандартное предположение, что каждый .c
файл будет напрямую соответствовать скомпилированному .o
файл.
Нормальная картина такова, что .h
файлы для вещей, которые включены в другие места (и, в частности, в нескольких других местах), и что .c
файлы для вещей, которые скомпилированы один раз в объектные файлы.
Таким образом, следующие вещи обычно входят в .h
файлы:
- Функциональные прототипы
- Постоянные декларации
- Глобальная переменная
extern
декларации - Встроенные определения функций
- Определения типов
- и макроопределения, например, о чем вы спрашиваете.
И наоборот, следующие вещи обычно входят в .c
файлы:
- Определения глобальных переменных
- Определения функций, которые будут скомпилированы в объектный код и связаны
Случай "определения функций входит только в .c
"Файлы" - это просто вырожденный случай, когда у вас нет встроенных функций.
В C++, где множество функций определено в форме шаблона и, следовательно, определения должны включаться всякий раз, когда они используются, эти определения очень часто идут в .h
(или же .hpp
или что угодно) файл. Так что такого рода вещи определенно имеют прецедент.
Разместите их там, где они вам нужны.
Если вам это нужно только для одного файла, поместите его в начало этого файла.
Если вам это нужно для нескольких файлов, поместите его в заголовочный файл.
Я не обязательно рекомендую это, но видел это в довольно многих встроенных проектах за последние 10 с лишним лет: включайте встроенные функции как.inl.
Брукс хорошо распределяет обязанности. Вы могли бы рассмотреть возможность разделения встроенных и макроопределений от обычных прототипов функций и таких:
#include "prototypes.h"
#include "macros.inl"
int foo(void);
int bar(char);
Ваша конечная цель - последовательность: любые решения о компоновке должны помочь тем, кто вас сменит.