#define вызывает «ожидаемое первичное выражение» ошибка

#define N 10;

int main()
{
int x;

for (int i=0; i<N; i++)
x = i;

return 0;
}

Результат компиляции в g ++:

test-define.cpp: In function ‘int main()’:
test-define.cpp:7:22: error: expected primary-expression before ‘;’ token
test-define.cpp:7:22: error: expected ‘)’ before ‘;’ token
test-define.cpp:7:24: error: name lookup of ‘i’ changed for ISO ‘for’ scoping [-fpermissive]
test-define.cpp:7:24: note: (if you use ‘-fpermissive’ G++ will accept your code)
test-define.cpp:7:27: error: expected ‘;’ before ‘)’ token

Но он прекрасно компилируется, когда я изменяю строку 7 на for (int i=0; i<10; i++),

Почему это так и как я могу использовать #define Директива для достижения того, что я хочу?

3

Решение

Удалите точку с запятой — вам будет хорошо — точка с запятой включена в замену

Иногда бывает полезно, чтобы компилятор запускал только препроцессор. С gcc / g ++ вы можете сделать что-то вроде

gcc -E file.c > result.txt

Это покажет вам, как расширился макрос (подсказка запускается в конце файла и работает)

12

Другие решения

Я рекомендую заменить макрос константой:

const int N = 10;

Лучше избегать макросов, когда вы можете. Макросы не имеют никакой области видимости. Это глобальная текстовая замена. Компилятор никогда их не видит, поэтому, если вы используете отладчик, он не узнает о них. Возможно, есть другие причины не использовать их, которые я забыл.

6

По вопросам рекламы [email protected]