Есть ли способ избежать директивы препроцессора C? - PullRequest
8 голосов
/ 07 октября 2011

Я пытаюсь получить директивы C 100 * * *, #else и #endif для препроцессора. То есть я хотел бы как-нибудь «избежать» директивы, чтобы выходные данные препроцессора включали эту директиву и были препроцессором для запуска на выходе.

Можно ли "экранировать" директиву CPP, чтобы она выводилась препроцессором так, чтобы выходные данные директивы escape были бы директивой препроцессора, если бы выход CPP сам подвергался предварительной обработке?

Ответы [ 3 ]

10 голосов
/ 07 октября 2011

Небольшой вариант Ответ Марсело Кантоса работает для меня в GNU cpp 4.4.3:

#define HASH(x) x

...

HASH(#)ifdef __cplusplus
class foo { };
HASH(#)endif
6 голосов
/ 07 октября 2011

РЕДАКТИРОВАТЬ: Следующий ответ работает только на более ранних версиях cpp. Он разрывается где-то между 4.2.1 и 4.3.2. gcc -E и g++ -E ломаются еще раньше. Подробности смотрите в комментариях.


Вот одна хитрость, которая работает:

#define HASH() #

...

HASH()ifdef __cplusplus
class foo { };
HASH()endif

Вам придется использовать cpp напрямую, поскольку компилятор попытается немедленно использовать выходные данные препроцессора и не будет знать, что делать с необработанными директивами.

4 голосов
/ 07 октября 2011

Еще один трюк, который, кажется, работает:

#define EMPTY
EMPTY#ifdef

С препроцессором GCC (версия 4.5.2) я получаю:

 #ifdef

По какой-то причине этот метод имеет тот жеведущая космическая проблема - решение Ильмари Каронена , но это, вероятно, не проблема с современными препроцессорами С, соответствующими стандартам.

...