【问题标题】:How to print macros in msvc preprocessor?如何在 msvc 预处理器中打印宏?
【发布时间】:2015-04-17 17:27:34
【问题描述】:

有没有办法使用 msvc 或 gcc 在预处理器文件中查看我的#defines?

这里有一个小代码:

#include <iostream>

#define asdasdadda asdsad    

int main()
{
    #ifdef asdasdadda
        std::cout << "yes\n";
    #else
        std::cout << "no\n";
    #endif

    return 0;
}

我是这样用cl编译的:

$ cl main.cpp /C /P

这是预处理后的 main.i 的尾部:

#line 2 "main.cpp"




int main()
{

        std::cout << "yes\n";


#line 13 "main.cpp"

    return 0;
}

这是我所期望的:

#line 2 "main.cpp"


#define asdasdadda asdsad

int main()
{

        std::cout << "yes\n";


#line 13 "main.cpp"

    return 0;
}

gcc 的行为是一样的...

【问题讨论】:

  • 这很好笑,你为什么不看原始源代码?
  • 您可以让编译器在将源代码应用于预处理器并剥离 cmets 后输出源代码。请注意,#includes 使它成为一个可以使用的工具。
  • @PranitKothari:这一切都很好,但复杂的嵌套预处理器条件对你没有多大好处。

标签: c++ gcc visual-c++ c-preprocessor


【解决方案1】:

有一个未记录的编译器开关/d1PP,它将在预处理器输出中保留宏定义。如果您使用/P /d1PP 编译 Rado 的示例,您将获得以下输出文件:

#line 1 "q.cpp"
#define BLAH 1

int main()
{

      cout << "BLAH defined" << endl;


#line 10 "q.cpp"
}

请注意,此开关未记录在案。因此,它不受官方支持。它可能随时被删除,或者它的行为可能随时改变。它可能有错误。使用风险自负等。

【讨论】:

    【解决方案2】:

    不要认为 MSVC 支持这个,但是使用 gcc 或 clang,使用 -dD 选项。请参阅Options Controlling the Preprocessor 了解更多信息。具体来说:

    -dCHARS

    M 不是正常输出,而是生成#define的列表 在执行期间定义的所有宏的指令 预处理器,包括预定义的宏。这为您提供了一种方法 找出您的预处理器版本中预定义的内容。 假设你没有文件 foo.h,命令

    touch foo.h; cpp -dM foo.h

    将显示所有预定义的宏。

    DM 类似,除了两个方面:它不包含预定义的宏,它同时输出#define 指令和预处理结果。两种输出都进入标准输出文件。

    例子:

    #define BLAH 1
    
    int main()
    {
    #ifdef BLAH
          cout << "BLAH defined" << endl;
    #else 
          cout << "undef" << i << endl;
    #endif
    }
    

    g++ -E -dD q.cpp 产生:

    # 1 "q.cpp" 2
    #define BLAH 1
    
    int main()
    {
    
          cout << "BLAH defined" << endl;
    
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-10-09
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-15
      • 1970-01-01
      • 2021-02-04
      相关资源
      最近更新 更多