MAXLINE
вообще не является переменной. На самом деле это не синтаксис Си. Часть процесса компиляции запускает препроцессор перед компилятором, и одно из действий, которые предпринимает препроцессор, заключается в замене экземпляров MAXLINE
токенов в исходном файле тем, что идет после #define MAXLINE
(5000 в коде вопроса).
В сторону: другой распространенный способ использования препроцессора в вашем коде - это директива #include
, которую препроцессор просто заменяет предварительно обработанным содержимым включенного файла.
Пример
Давайте рассмотрим пример процесса компиляции в действии. Вот файл foo.c
, который будет использоваться в примерах:
#define VALUE 4
int main()
{
const int x = VALUE;
return 0;
}
Я использую gcc
и cpp
( препроцессор C ) для примеров, но вы, вероятно, можете сделать это с любым вашим набором компиляторов, с разными флагами, конечно.
Компиляция
Для начала давайте скомпилируем foo.c
с gcc -o foo.c
. Что случилось? Это сработало; теперь у вас должен быть исполняемый файл foo
.
Только предварительная обработка
Вы можете указать gcc
только на предварительную обработку и не делать никакой компиляции. Если вы сделаете gcc -E foo.c
, вы получите стандартный обработанный файл. Вот что он производит:
# 1 "foo.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "foo.c"
int main()
{
const int x = 4;
return 0;
}
Обратите внимание, что первая строка main
заменила VALUE
на 4
.
Возможно, вам интересно, какие первые четыре строки. Они называются линейными маркерами, и вы можете прочитать о них больше в Выход препроцессора .
Компиляция без предварительной обработки
Насколько я знаю, вы не можете сразу пропустить предварительную обработку в gcc
, но существует пара подходов, чтобы сказать, что файл уже был предварительно обработан. Однако даже если вы сделаете это, он удалит макросы, присутствующие в файле, поскольку они не предназначены для использования компилятором. Вы можете увидеть, с чем работает компилятор в этой ситуации с gcc -E -fpreprocessed foo.c
:
.
.
.
.
int main()
{
const int x = VALUE;
return 0;
}
Примечание: я положил точки сверху; притвориться, что это пустые строки (мне пришлось поместить их туда, чтобы эти строки отображались SO).
Этот файл явно не скомпилируется (попробуйте gcc -fpreprocessed foo.c
, чтобы выяснить это), потому что VALUE
присутствует в источнике, но нигде не определен.