Member 14067789 Ответов: 1

В C, при попытке ##, это работает странно, если int предоставляются в качестве переменных.


Есть такая функция:
#включить <stdio.h>
#определить UNI(x,y) x##2
тап_п(недействительными) {
int i = 5;
инт И2 = -2;
printf("%d",UNI(i,i2));
возвращает 0;
}
Это печатает -2, когда он должен печатать 52!

Что я уже пробовал:

#Define работает только в том случае, если число после ## равно 2. Все остальные числа приводят к ошибке компиляции. Кроме того, если число равно 2, то результат равен -2 независимо от значения i.
Прикинул, что x##2 всегда будет переворачивать результат Y. Почему?

CPallini

Что ты пытаешься сделать?

1 Ответов

Рейтинг:
6

OriginalGriff

Для меня, я правильно получаю сообщение об ошибке:

main.c:14:18: error: ‘i2’ undeclared (first use in this function)

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

#define это директива препроцессора, и он заменяет текст в вашем исходном файле до того, как он будет передан фактическому компилятору.
UNI(i) будет заменен на i2 не "содержимое переменной ie, за которым следует "2", так как часть препроцессора завершена задолго до компиляции и не может ссылаться на значения времени выполнения.


Member 14067789

Извините за это, попробуйте прямо сейчас.

OriginalGriff

Да: он напечатает -2. Почему?
Потому что это препроцессор, который заменяет текст.
Когда вы компилируете, препроцессор запускается и выполняет свои замены. После этого ваш код выглядит следующим образом:

#определить UNI(x,y) x##2
тап_п(недействительными) {
int i = 5;
инт И2 = -2;
printf("%d",i2);
возвращает 0;
}

Это то, что передается компилятору, поэтому печатается переменная i2, а не "содержимое переменной "i" с "2" на конце!

Member 14067789

Ладно, понял, спасибо! Это был хороший трюк! :)

OriginalGriff

Всегда пожалуйста!