Вам не нужно использовать ##
каждый раз, когда вы используете аргумент в макросе.
Это нужно только тогда, когда вы хотите объединить аргумент с другим текстом,сформировать единый «токен». Например, если у вас есть «bo» и «ol» и вы хотите сделать «bool».
В этом случае <<
и "area"
должны быть разными токенами. Фактически, <<"area"
не будет действительным токеном.
Поскольку ваш аргумент является токеном сам по себе, вы буквально просто пишете его там в коде:
#define func(type1,varname1) \
cout << "ma var est " << varname1 << " et le type est " << #type1; \
cout << endl;
Токеныпочти слова, но это слова языка программирования, а не английские слова. Вы можете прочитать больше о токенах в книге или руководстве по парсерам.
(Вам все еще может понадобиться #type1
, потому что это делает что-то другое: преобразование аргумента в строковую версию его значения. Однако, поскольку вы уже передаете строку "int"
, в настоящее времявам это там тоже не нужно.)
В CCSunStudio оно отлично работает
На самом деле это означает, что не правильно работает в Sun Studio!
У меня нет ошибки при компиляции в Solaris с помощью CCSunStudio.
Похоже, что в Sun Studio есть уровеньсовместимости со старинными K & R C, , которые сделали вещи немного по-другому .
Вы можете использовать параметр -xtransition
, чтобы найти другие места, где ваш код требует обновления добыть стандартным.