C++ 如何从boost::wave获取完整、扩展、字符串化的宏?

C++ 如何从boost::wave获取完整、扩展、字符串化的宏?,c++,boost,c-preprocessor,C++,Boost,C Preprocessor,我有一个包含以下内容的文件: #define str(s) s #define xstr(s) #s #define foo 4 #define first str(foo) #define second xstr(foo) first=str(foo) foo=4 second=xstr(foo) str(s)=#s xstr(s)=str(s) 当我将其传递到boost::wave时,宏映射包含以下内容: #define str(s) s #define xstr(s) #s #defi

我有一个包含以下内容的文件:

#define str(s) s
#define xstr(s) #s
#define foo 4
#define first str(foo)
#define second xstr(foo)
first=str(foo)
foo=4
second=xstr(foo)
str(s)=#s
xstr(s)=str(s)
当我将其传递到boost::wave时,宏映射包含以下内容:

#define str(s) s
#define xstr(s) #s
#define foo 4
#define first str(foo)
#define second xstr(foo)
first=str(foo)
foo=4
second=xstr(foo)
str(s)=#s
xstr(s)=str(s)
如何使宏完全展开,以便:

first="foo"
second=4

我认为boost::wave支持宏重新扫描和查找。我是否缺少一些东西,或者我是否需要对处理挂钩做些什么来实现扩展?我的意思是,我可以编写代码来完成这项工作,但是如果我错过了一些重要的事情,如果我不必做这项工作,那就太好了。

来自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";
如果您需要在处理完成后查看宏是如何定义的,则始终可以执行类似操作(这取自Wave驱动程序代码):

auto-end=ctx.macro_-names_-end();
for(auto it=ctx.macro_names_begin();it!=end;++it){
typedef std::向量参数_type;
bool has_pars=false;
bool-predef=false;
上下文类型::位置类型位置;
参数_型PAR;
context_type::token_sequence_type def;
if(ctx.get_macro_definition(*it,has_pars,predef,pos,pars,def)){
//如果has_pars为true,则可以遍历pars以查看
//函数宏的参数
//迭代def以查看宏定义
}
}
当然,宏是以非扩展形式存储的


(注意,如果你写一个答案,我会接受的)

我想你的意思是
#定义str(s)#s
#定义xstr(s)str(s)
你可以重新定义或取消定义
str
,但是
firsrs
仍然必须扩展到
str(foo)
。这就是为什么它不能完全扩展存储。啊。这是有道理的。为了得到宏的求值,我必须在某个地方使用它,比如在
char const firstdef[]=first
int const secondeval=second