Проверка работоспособности определений из массивов - PullRequest
0 голосов
/ 08 февраля 2019

Я выискиваю причину ошибки и думаю, что, возможно, нашел ее, если мое понимание использования #define правильное.

Как я понимаю, когда вы что-то определяете, его набор, которыйКстати, даже если определение заполнено значением переменной, оно придерживается значения во время компиляции и не изменится, если переменная изменится позже?Таким образом, этот код:

int values[] = {5,6,7,8};
int x = 0;
#define DEF_VALUE values[x]

DEF_VALUE будет 5, а 5 - это значение позиции 0 в массиве значений.

Но если бы я это сделал:

int values[] = {5,6,7,8};
int x = 0;
#define DEF_VALUE values[x]
x = 2;

DEF_VALUE будет по-прежнему равным 5, поскольку это был вывод значений [x] во время вызова #define, поэтому изменение значения x позднее на 2 не приведет к изменению DEF_VALUE на 7 (значениепозиция 2 в массиве значений).

Правильна ли моя логика здесь?

Если я так думаю, я нашел свою ошибку, так как оригинальный программист этого кода полагался на обновление x для обновлениязначение DEF_VALUE позже в коде для адреса местоположения для выборов.

1 Ответ

0 голосов
/ 08 февраля 2019

Способ работы #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 не присутствуют в этой области, он не может скомпилировать.

...