#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
Директива для достижения того, что я хочу?
Удалите точку с запятой — вам будет хорошо — точка с запятой включена в замену
Иногда бывает полезно, чтобы компилятор запускал только препроцессор. С gcc / g ++ вы можете сделать что-то вроде
gcc -E file.c > result.txt
Это покажет вам, как расширился макрос (подсказка запускается в конце файла и работает)
Я рекомендую заменить макрос константой:
const int N = 10;
Лучше избегать макросов, когда вы можете. Макросы не имеют никакой области видимости. Это глобальная текстовая замена. Компилятор никогда их не видит, поэтому, если вы используете отладчик, он не узнает о них. Возможно, есть другие причины не использовать их, которые я забыл.