n.m.的線索很重要。宏可以在任何時候定義和定義,所以它只是相關的使用實例。
這比我預想的要容易得多。如果我在頭文件中有這樣的內容:
#define str(s) #s
#define xstr(s) str(s)
...
#define MAJORVER 1
#define MINORVER 0
#define MAJORBUILD 0
#define MINORBUILD 1
#define FULLBUILDSTRING xstr(MAJORVER) "." \
xstr(MINORVER) "." \
xstr(MAJORBUILD) "." \
xstr(MINORBUILD)
FULLBUILDSTRING宏將評估爲聲明的字符串。但是,如果我有一些代碼,直接利用宏觀的,比如在
static char const full_build_string[] = FULLBUILDSTRING;
它將評估以下時,浪潮對其進行處理:
static char const full_build_string = "1" "." "0" "." "0" "." "1";
如果你需要怎麼看宏定義後處理完成,你總是可以做一些像這樣(這是從波驅動程序代碼所):
auto end = ctx.macro_names_end();
for (auto it = ctx.macro_names_begin(); it != end; ++it) {
typedef std::vector<context_type::token_type> parameters_type;
bool has_pars = false;
bool predef = false;
context_type::position_type pos;
parameters_type pars;
context_type::token_sequence_type def;
if (ctx.get_macro_definition(*it, has_pars, predef, pos, pars, def)) {
// if has_pars is true, you can iterate through pars to see
// parameters for function macros
// iterate through def to see the macro definition
}
}
當然,宏存儲在非擴張形式。
(納米,如果你寫一個答案,我會接受的)
我想你meant'#定義STR(S)#s''#定義XSTR(S)STR(S)' –
你可以在路上重新定義或取消定義'str',但'firsr'仍然必須展開爲'str(foo)'。這就是爲什麼它不能被完全展開。 –
啊。這是有道理的。爲了得到一個宏的評價,我必須在某個地方使用它,例如'char const firstdef [] = first;''const const secondeval = second;'' –