2016-01-22 4 views
1

Когда я пытаюсь скомпилировать это (я пытаюсь понять, что здесь ##), я получаю сообщение об ошибке «i2 undeclared». У меня нет переменной под этим именем, это весь код, который у меня есть.Weird ошибка компилятора с GCC (кодовые блоки)

#include <stdio.h> 


#define A(x,y) x##2-y 


int main() 
{ 
    int i = -1; 
    int j = -2; 
    printf("%d \n", A(i,j)); 
    return 0; 
} 
+0

Что вы ожидаете? Просто посмотрите, что делает оператор ## '_concatenation operator_ (и почему он называется так). – Olaf

+0

Где находится переменная «i2», с которой компилятор жалуется. Я не использовал его. –

+0

, когда вы передаете i в качестве параметра в функции A(), препроцессор принимает его как i и объединяет с 2? – tigris

ответ

3

После предварительной обработки, это утверждение

printf("%d \n", A(i,j)); 

становится:

printf("%d \n", i2-j); 

Как вы можете видеть, что нет ни одной переменной i2 в коде. Следовательно, ошибка. ##token pasting operator, который пасты два токена i и 2 вместе и будет i2.

+0

Это проясняет ситуацию, спасибо большое! –

3

## объединяет свои операнды. Итак, для A(i,j) вы получаете i##2-y, который после конкатенации становится i2-y. И поскольку, как вы говорите, вы не определяете переменную i2 в любом месте вашего кода, вы правильно получите ошибку, чтобы i2 не существует.

+0

Это проясняет ситуацию, спасибо большое! –

5

## просто означает форму новой предварительной процессорной константы из двух выражений («вставить вместе»).

Ваш макрос расширяется до i##2-j, который совпадает с i2-j. Вы ничего не называете i2, что является ошибкой компилятора.

+0

Это проясняет ситуацию, спасибо большое! –

Смежные вопросы