2011-01-12 3 views
0

Можно создать дубликат:
c++ preprocessor macro expansion to another preprocessor directiveопределить макрос расширен буквальные #

Мой вопрос очень прост: я хочу использовать «#» в макроподстановках, например, для определения марко 'M (X)':

#define M(X) #ifdef FOO \ 
       X=1 \ 
      #else \ 
       X=2 

Я пытался использовать '\', чтобы избежать '#', но '\' интерпретируется как символ новой строки F или макрорасширение, а не как escape-символ. Итак, как использовать '#' в расширении макросов?

Спасибо, ребята!

+0

Вы должны принять любой ответ, который был вам полезен. (Нажмите галочку и поверните ее зеленым цветом.) –

ответ

6

Извините, но вы не можете создать макрос, чтобы создать другой макрос, потому что предварительный процессор имеет один проход. Кроме того, из стандарта C99: (пункт 3 6.10.3.4)

:

3 Полученный полностью макро-маркер заменяется предварительной обработки последовательность не обрабатывается как директива в предварительной обработки, даже если он напоминает один , ...

C++ имеет нечто похожее.

+0

Не ожидал ответа так быстро и точно, салют! – lukmac

6

Вы могли бы сделать наоборот:

#ifdef FOO 
    #define M(X) X=1 
#else 
    #define M(X) X=2 
#endif 
+0

+1, похоже, разумное решение. –

+0

Ваше решение идеально подходит для меня, аплодисменты! – lukmac

1

Как @Evan указывает, макро расширения осуществляется за один проход, так что ваш пример не будет работать. Однако, вот альтернатива, которая делает то, что вы хотите, хотя и в нескольких строках.

#ifdef FOO 
#define FOOVAL 1 
#else 
#define FOOVAL 2 
#endif 

#define M(X) X=FOOVAL