Суть вопроса, кажется, была хорошо изложена в кратком изложении, которое было отредактировано:
Редактировать : Как препроцессор узнал, что я пытаюсь предотвратить двойное включение заголовочного файла с именем test.h
, если имя после #ifndef
не имеет значения и может иметь следующий вид: #ifndef Dummy
,
Препроцессор не Знайте, что вы специально пытаетесь предотвратить многократное включение или что-либо предпринимаемое в отношении имени файла заголовка, который вы пытаетесь защитить. Это приложение механизма условной компиляции общего назначения препроцессора к конкретной задаче c размещения (не фактически предотвращающей) многократного включения.
и в чем даже смысл используя имя, если я не собираюсь его использовать [...]
Но вы действительно используете его. В директиве #ifndef
. То, что упомянутое имя макроса совпадает с именем #define
d, крайне важно для правильной работы этого механизма.
Механизм использует тот факт, что препроцессор может проверять, заданы ли c имена макросов определены и используют результат в качестве условия для того, компилируется ли связанный раздел исходного файла. Вот что такое #ifndef
... #endif
. #define
гарантирует, что при компиляции раздела между ними будет задан указанный макрос препроцессора, так что условие #ifndef
оценивается как ложное при последующих включениях того же заголовка. Таким образом, указанный c выбор имени макроса не имеет значения, но тот факт, что он отличается от всех имен макросов, используемых другими заголовками (или что это не так, если это делается целенаправленно), равен значительно.
если они облегчат задачу и позволят нам только набрать:
#ifndef
#define
Опять же, это конкретное c приложение общего назначения механизм. Механизм общего назначения предназначен для определения макросов препроцессора и проверки того, определены ли они, которые являются частью более крупного средства макросов препроцессора. Это средство работает в терминах заданных c имен макросов. Более того, даже если бы оно было разумным, пустое имя макроса не сработало бы для этой цели, потому что (если оно используется в общем случае) оно не удовлетворяло бы необходимому критерию каждого заголовка, использующего отдельное имя макроса.
Однако некоторые * Реализации 1054 * согласны с вами, что защита заголовков может быть проще. Как общее (но не универсальное!) Расширение , некоторые реализации распознают
#pragma once
, появляющийся в начале заголовка, в качестве замены средств защиты на основе условной компиляции.