Наилучшая практика в файлах заголовков C С#ifndef #define #endif
Что касается лучшей практики в отношении следующего "шаблона"?
#ifndef BLAFOO_H
#define BLAFOO_H
/* ...
* ...
*/
#endif /* BLAFOO_H */
как мне назвать заголовок в директиве #define
? я видел все от BLAFOO_H
до __BLAFOO_H
до _BLAFOO_H_
и т.д.
Ответы
Ответ 1
Назовите их BLAFOO_H
(лично я использую BLAFOO_H_
, где BLAFOO - это имя файла заголовка).
Убедитесь, что ваш BLAFOO не сталкивается с другими файлами/библиотеками и т.д. вы используете, например. имя вашего проекта и/или модуля должно быть частью этого имени.
Идентификаторы, начинающиеся с _
, зарезервированы для реализации/компилятора, поэтому не используйте это.
Ответ 2
Я использую UUID, что я гарантирую, что #define
не столкнулся с другими. Я видел его где-то и решил использовать его также.
Мой шаблон выглядит так: __<filename>_H_<uuid>__
,
например. #define __TYPES_H_79057761_16D6_478A_BFBC_BBF17BD3E9B9__
для файла с именем types.h
Ответ 3
Единственное реальное требование состоит в том, что он не будет конфликтовать с другим проектом, который использует одно и то же имя для своего файла. Для всех проектов, которые я видел, он обычно полностью количественно определяет пространство имен (или любую папку, в которой находится файл для C), вместе с именем проекта. Иногда он включает дату создания файла.
Итак, если вы сейчас работаете над проектом ABC в папке DEF, то вы можете сделать:
#ifndef ABC_DEF_BLAFOO_H_05_30_2010
И это вряд ли будет противоречить чему-либо.
Ответ 4
Как и в других вопросах стиля C, просто последовательно. Нет никакого способа, чтобы вы узнали пространство имен в каждой библиотеке, которую кто-то мог бы связать с вашей программой в будущем. Зачем? Многие из них еще не написаны:)
Как таковой, его вопрос не включает в себя охрану, его вопрос о том, как назвать заголовок в первую очередь.
Я мог бы придумать некоторые полезные утилиты для новой строки и назвать заголовок strutil. Это плохая идея, потому что (конечно) кто-то еще придумал классные новые утилиты строк и назвал заголовок тем же самым.
Итак, я называю мои post_strutils.h и:
#ifndef POST_STRUTILS_H
#define POST_STRUTILS_H
/* code */
#endif
Я даже могу назвать его post_str_utils.h
и правильно определить включенные охранники, потому что знаю, что у меня очень распространенная фамилия. Найти пространство имен иногда сложно. Просто использование одного предложения не гарантирует, что кто-то еще сделал поиск, прежде чем выпустить что-то в дикую природу. Будьте как можно более уникальными.
В зависимости от того, где кто-то говорит своему компилятору искать заголовки, это не просто конфликты пространства имен, которые входят в игру, но и имена файлов. Сделайте все возможное, чтобы назвать заголовок однозначно, а затем напишите включенный охранник, чтобы он соответствовал ему. Кто-то может захотеть #error
, если заголовок был включен несколько раз, хотя бы для вырезания директив #include
, которые не нужны, использование типа UUID делает это запутанным, поскольку оно не соответствует (или даже напоминает ) имя файла соответствующего заголовка. Он также упрощает запись grep/awk
(или аналогичных) приведенных в действие строк шрифтов.
Я не говорю, что вы должны называть каждую библиотеку/модуль после себя, но будьте осторожны, чтобы сделать имена публичных заголовков уникальными. Быстрая конференция с поисковой системой сообщит вам, если вы нажмете на неиспользуемое пространство имен. Пожалуйста, позвольте включенным охранникам соответствовать (или, по крайней мере, близко напоминать) заголовок. Опять же, консистенция высоко оценивается. Из вашего примера я бы ожидал:
int blahfoo_init(void);
double blahfoo_getval(blahfoo_t *blah);
Если вы столкнулись с проблемой поиска уникального пространства имен, обязательно используйте его:)
Ответ 5
Это не имеет значения, если это вряд ли будет использоваться где-либо еще. Обычно я использую что-то вроде BLAFOO_H_INCLUDED
.