2015-06-14 2 views
2

Я пытаюсь сделать какую-то простую систему, которая вычисляет количество сборок, включая эту информацию в .rc-файле (для Windows) и встречает проблему. Вот оно:Сделать C++ macro2 содержать цитировать тело макрокоманды

#define QUOTE(s) #s 
#define A  0,0,0,1 
#define A_STR QUOTE(A) 

Расширение A_STR: "A" но не "0,0,0,1", как я ожидал.

Ну, мне нужно A_STR быть строковым представлением A (вот что windres ожидает увидеть в .rc файле), но я не могу найти способ сделать это.

Я уже пробовал smth как #define A_STR #A, но он просто расширяется до #0,0,0,1.

Я также пробовал использовать qmake вот так: DEFINES *= A_STR="<here-is-how-I-get-version>" но gcc получает его без кавычек, и у меня такая же проблема.

ответ

2

Когда макрос препроцессора C расширяются, ее параметры будут расширены их буквенных аргументы, так s будет расширен до A, когда ваш QUOTE(s) принимает аргумент A расширяется. Как правило, после завершения этого расширения расширенный текст затем сканируется , чтобы развернуть все встроенные в него макросы, поэтому это приведет к тому, что A будет расширяться до 0,0,0,1. Однако, когда оператор строчки # используется для форматирования следующего текста, это происходит сначала, поэтому следующий текст никогда не получает возможности быть расширенным, таким образом, вы получите строковое значение "A" в качестве окончательного расширения A_STR.

Эта проблема обычно решается путем введения второго уровня косвенности, который задает начальному параметр макроса следует второй шанс расширить:

#define QUOTE2(A) #A 
#define QUOTE(A) QUOTE2(A) 

Однако, это не будет фактически работать для вашего дела, потому что в расширение первого уровня: A будет расширяться до 0,0,0,1, что будет приниматься за четыре аргумента до QUOTE2() и поэтому будет отклонено как недопустимый макросообщение.

Вы можете решить эту проблему с переменным числом аргументов макросов и __VA_ARGS__:

#define QUOTE2(...) #__VA_ARGS__ 
#define QUOTE(...) QUOTE2(__VA_ARGS__) 
+1

Это работает! Особая благодарность за отличное объяснение процесса расширения! – dazewell

Смежные вопросы