Это не имеет ничего общего с Си как таковой. Если вы загляните во включаемый файл less.h, то увидите, что автор определил ряд инструкций препроцессора. Некоторые из них, такие как «public», наиболее вероятны для удобства чтения. Например:
/*
* Language details.
*/
#if HAVE_VOID
#define VOID_POINTER void *
#else
#define VOID_POINTER char *
#define void int
#endif
#if HAVE_CONST
#define constant const
#else
#define constant
#endif
#define public /* PUBLIC FUNCTION */
Посмотрите, как определяется public. Он переведен ни к чему, и, как вы уже поняли, он находится в глобальном масштабе. Однако, это более читабельно и более очевидно, что оно находится в глобальном масштабе. Кроме того, можно утверждать, что если источник написан последовательно, как это, и появляется новая версия C, которая имеет ключевое слово public , это вопрос переопределения файла заголовка и перекомпиляции для его фактического использования.
Подобные приемы предварительной обработки могут даже использоваться умными способами, чтобы один исходный код компилировался на разных языках (таких как C ++ и Java). Это не то, что вы должны делать, но это возможно.
Параметры, такие как HAVE_VOID, которые вы видите в примере из less.h выше, обычно указываются как параметры компилятора (фактически препроцессора) во время компиляции. Поэтому, если у вас есть компилятор и версия C, которая поддерживает ключевое слово void , вы скомпилируете свой исходный код:
g ++ -g -DHAVE_VOID -Wall myprog.C -o
MyProg
Везде, где автор использует VOID_POINTER в источнике, компилятор фактически будет рассматривать его как:
void *
Если вы не указали HAVE_VOID, компилятор вместо этого будет использовать
char *
, что является разумной заменой.
СОВЕТ: Проверьте параметры вашего компилятора, чтобы увидеть, есть ли у вас возможность просто обработать исходные тексты. Таким образом, вы можете посмотреть фактический источник, который отправляется компилятору.