【问题标题】:Disabling conditional macro evaluation in clang在clang中禁用条件宏评估
【发布时间】:2018-01-06 21:35:07
【问题描述】:
#define NUM 1
    #if(NUM)
        if(globalglobalInteger){
            result = 1;
        }
    #else
    result=2
    #endif

鉴于上述代码,要求条件宏#if不应被评估,#if#else下的所有代码都应传递给进一步处理。

基本上我希望活动和非活动部分(#if 下的代码和#else 下的代码)都出现在 clang AST 中。

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

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

【问题讨论】:

    标签: clang preprocessor


    【解决方案1】:

    预处理发生在解析和 AST 生成之前,所以你不能 AST 中的非扩展定义和宏。

    但是,有一些方法可以处理非预处理代码 - 例如注册到 clang 预处理器回调(PPCallbacks 接口)或通过pp-trace 工具 (免责声明:我自己没有这方面的经验)。

    参考文献:

    关于标志,clang 不等同于 gcc 的-fdirectives-only。为了将宏的两个部分都保留在输出中, 您可以完全禁用预处理,类似于 gcc 的 -fpreprocessed - 这将有效地禁用宏扩展(但 AST 中仍然没有宏)。

    您可以使用以下命令检查为非预处理源文件生成的 AST:

    clang -xcpp-output -Xclang -ast-dump -c foo.c
    clang -xc++-cpp-output -Xclang -ast-dump -c foo.cpp

    HTH - 祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-19
      • 1970-01-01
      • 2011-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多