Макрос препроцессора GCC: вставка x и x не дает действительный токен предварительной обработки - PullRequest
6 голосов
/ 12 января 2011
#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:

Ошибка: ошибка: вставка "/" и "includefile" не дает действительный токен предварительной обработки

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

Ошибка: вставка "includefile" и "."не дает действительный токен предварительной обработки

1 Ответ

1 голос
/ 07 октября 2013

GCC немного более строг в применении стандарта C: см. Различия в операторе сцепления Macro ## между 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.

...