Препроцессор C делает просто фиктивную замену текста в время компиляции .
Что означает подстановка текста ? Препроцессор выведет код C, заменяя параметры макроса переданными значениями. Неважно, передадите ли вы переменную или постоянное число, вы просто получите фиктивную подстановку (также называемую макросом «расширение»).
Давайте посмотрим, как препроцессор будет «расширяться» #define cat(a,b,c) a##b##c
.
d=cat(1,2,3);
расширяется до: d=123;
, и это действительный код, поскольку вы объявили int d
.
d=cat(a,b,c);
расширяется до: d=abc;
, и это не скомпилируется, так как нет переменной int abc
.
Что означает время компиляции ? Это означает, что эта подстановка текста выполняется в исходном коде, а вывод игнорирует содержимое переменных, передаваемых в макрос. Другими словами, не имеет значения, что вы инициализировали a
, b
и c
до 1
, 2
и 3
: результатом будет только конкатенация (из-за ##
оператор препроцессора "вставка токена") переданных значений. В вашем случае результат будет abc
, что ничего не значит в вашем коде.