Включить соглашения о защите в C

Каков обычный способ настройки ваших охранников? Я обычно пишу их как (например .h):

#ifndef _EXAMPLE_H_
#define _EXAMPLE_H_
#include "example.h"
#endif

Соответствует ли значение подчеркивания? Я видел противоречивую информацию, когда я искал это. Может ли _EXAMPLE_H_ соответствовать совпадению имени заголовка?

Ответ 1

Does underscore convention matter?

Да. Это важно.

Идентификаторы с ведущим подчеркиванием, за которым следует буква верхнего регистра, зарезервированы для реализации. Итак, у вас есть поведение undefined.

Ниже приведена стандартная спецификация C для обозначения идентификаторов (проект C11):

7.1.3 Зарезервированные идентификаторы

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

- Все идентификаторы, начинающиеся с символа подчеркивания, и прописная буква или другое подчеркивание всегда зарезервированы для любого использовать.

- Все идентификаторы, начинающиеся с символа подчеркивания, всегда зарезервированы для использования в качестве идентификаторов с объемом файла как в обычном, так и в теге пространства имен.

- Каждое имя макроса в любом из следующих подпунктов (включая будущие направления библиотек) зарезервировано для использования, как указано, если какой-либо из связанные с ним заголовки; если явно не указано иное (см. 7.1.4). - Все идентификаторы с внешней связью в любом из следующих подпунктах (включая будущие направления библиотек) и errno всегда зарезервированы для использования в качестве идентификаторов с внешними linkage.184) - Каждый идентификатор с областью файлов, указанный в любом из следующие подпункты (включая будущие направления библиотек) зарезервировано для использования в качестве имени макроса и как идентификатор с областью файлов в том же имени, если включен какой-либо из связанных заголовков.

Никакие другие идентификаторы не зарезервированы. Если программа заявляет или определяет идентификатор в контексте, в котором он зарезервирован (кроме как разрешено в соответствии с 7.1.4) или определяет зарезервированный идентификатор в качестве имени макроса, поведение undefined.

Если программа удаляет (с помощью #undef) любое определение макроса идентификатор в первой группе, указанной выше, поведение undefined.

Без нарушения какого-либо из вышеизложенного, имя защищающего включить может быть чем угодно и не должно быть именем файла заголовка. Но обычно соглашение, которое я видел/использовал, - это использовать то же имя, что и имя заголовка, чтобы оно не вызывало ненужной путаницы.

Ответ 2

Абсолютного требования относительно того, как включить охранников, не существует. Он не должен соответствовать имени заголовка. Я видел (и использовал себя) некоторые, которые используют UUID, в основном состоящий из случайно генерируемой шестнадцатеричной строки.

Технически, как сказал KingsIndian, идентификаторы, начинающиеся с символа подчеркивания, зарезервированы:

Правила, перефразированные из раздела ANSI. 4.1.2.1:

1. All identifiers beginning with an underscore followed
   by an upper-case letter or another underscore are always
   reserved (all scopes, all namespaces).
2. All identifiers beginning with an underscore are reserved
   for ordinary identifiers (functions, variables, typedefs, enumeration
   constants) with file scope.
...

comp.lang.c Часто задаваемые вопросы · Вопрос 1.29

Может быть, новый стандарт ISO C11 (?) ослабляет эти правила, но это была нижняя строка на некоторое время.