Способ работы #define
в C состоит в том, что он создает расширение , то есть в любом месте, где встречается DEF_VALUE
, компилятор обрабатывает его так, как если бы был написан values[x]
.Препроцессор C эффективно переписывает код, применяя эти расширения, и полученный переписанный код - это то, что передается компилятору.
В этом случае изменение x
приводит к изменению того, что DEF_VALUE
в конечном итоге оценивает до, но не до того, что расширяет.
Во втором случае оно расширяется до 7
тогда и только тогда, когда x
равно 2
.Если этот #define
используется в другой области, то результаты неизвестны или синтаксическая ошибка зависит от того, какие переменные присутствуют.
Некоторые тестовые коды:
void demo() {
int values[] = {5,6,7,8};
int x = 0;
#define DEF_VALUE values[x]
x = 2;
printf("%d\n", DEF_VALUE);
}
Здесь показано 7
как и ожидалось.
Как только препроцессор завершит работу с этим кодом, он получит следующую форму:
void demo() {
int values[] = {5,6,7,8};
int x = 0;
x = 2;
printf("%d\n", values[x]);
}
Если позже в вашем коде у вас есть это:
void other() {
printf("%d\n", DEF_VALUE);
}
Вы получаете синтаксическую ошибку.Это потому, что код, с которым компилятору говорят работать, на самом деле:
void other() {
printf("%d\n", values[x]);
}
Поскольку ни values
, ни x
не присутствуют в этой области, он не может скомпилировать.