在clang中禁用条件宏评估

时间:2018-01-04 06:34:11

标签: clang preprocessor

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中。

  • 铿锵有可能吗?
  • 是否有可用的预处理器标志 在clang中这样做?

看到gcc中有一个名为#else y的标志,它禁用宏扩展但在clang中找不到类似的标志

1 个答案:

答案 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

HTH - 祝你好运!