Макрос препроцессора GCC: вставка x и x не дает действительного токена предварительной обработки

#define  PATH  "yagh/headers/"
#define  FILNAME  "includefile"


#define CONCAT(a__, b__) CONCAT_DO(a__, b__)
#define CONCAT_DO(a__, b__) a__##b__
#define CONCATTHREE(a__, b__, c__) CONCAT(CONCAT(a__, b__), c__)
#define STRINGIFY(a__) #a__


#include STRINGIFY(CONCATTHREE(PATH  ,FILNAME  ,.h));

Этот макрос отлично работает в компиляторе VS, но не компилируется в компиляторе GCC:

Ошибка: ошибка: вставка «/» и «включаемый файл» не дает действительного токена предварительной обработки.

а для некоторых включаемых файлов выдает ошибку:

Ошибка: вставка "включаемого файла" и "." не дает действительный токен предварительной обработки


person SoccerKid    schedule 12.01.2011    source источник
comment
Объединение с оператором ## не работает со строковыми литералами, такими как "foo" в GCC. Что именно вы пытаетесь сделать с этим макросом?   -  person thkala    schedule 12.01.2011
comment
Вы когда-нибудь находили приемлемый ответ на эту проблему?   -  person Michael    schedule 25.09.2013
comment
Интересно. Я ожидал, что оба они выдадут ошибку типа unable to find include file "CONCATTHREE(PATH ,FILNAME ,.h)", что я и вижу, когда запускаю ваш код через gcc ...   -  person Chris Dodd    schedule 07.11.2013


Ответы (1)


GCC немного строже в обеспечении соблюдения стандарта C: см. Различия в операторе конкатенации макроса ## между Visual-C ++ и gcc и http://gcc.gnu.org/onlinedocs/gcc-4.3.3/cpp/Concatenation.html#Concatenation.

Вы можете попробовать #include STRINGIFY(PATH FILNAME.h) (важно отсутствие пробелов между FILNAME и .h) - у меня это работает с gcc 4.6.3.

person bks    schedule 07.10.2013