set option allow_read_client_file='on' ;
grant READCLIENTFILE to finsrv ;
鉴于上述代码,要求不应评估条件宏#define NUM 1
#if(NUM)
if(globalglobalInteger){
result = 1;
}
#else
result=2
#endif
,并且应传递#if
和#if
下的所有代码以供进一步处理。
基本上我希望活动和非活动部分(#else
下的代码和#if
下的代码)都存在于clang AST中。
看到gcc中有一个名为#else
y的标志,它禁用宏扩展但在clang中找不到类似的标志
答案 0 :(得分:0)
在解析和生成AST之前进行预处理,因此您无法进行预处理 AST中的非扩展定义和宏。
但是,有处理非预处理代码的方法 - 例如注册到clang预处理器回调(PPCallbacks
接口)或通过pp-trace
工具
(disclamer:我自己也没有这方面的经验)。
参考文献:
关于旗帜,clang与gcc -fdirectives-only
无关。为了保持宏的两个部分输出,
你可以完全禁用预处理,类似于gcc' s -fpreprocessed
- 这将有效地禁用宏扩展(但是AST中仍然没有宏)。
您可以使用以下命令替换为非预处理源文件生成的AST:
clang -xcpp-output -Xclang -ast-dump -c foo.c
clang -xc++-cpp-output -Xclang -ast-dump -c foo.cpp