如何可视化C / C ++ #define指令?

时间:2019-02-27 09:18:12

标签: c++ c visual-studio ide c-preprocessor

我正在寻找可视化#define效果的方法-例如,编译器未看到的代码以不同的颜色显示。

主要是视觉工作室,但是很高兴了解其他环境吗? 理想情况下,编译器也可以看到但不会运行的代码。

3 个答案:

答案 0 :(得分:9)

一种方法是在预处理后使用 gcc (对于C)或 g ++ (对于c ++)查看源代码,只需使用选项-E < / p>

例如具有文件p.cc

#ifdef FOO
# define BAR 1
#else
# define BAR 2
#endif

int main()
{
  return BAR;
}

如果我没有定义 FOO ,我有:

/tmp % gcc -E p.cc
# 1 "p.cc"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "p.cc"

int main()
{
  return 2;
}

如果我确实定义了 FOO 我有:

/tmp % gcc -DFOO -E p.cc
# 1 "p.cc"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "p.cc"

int main()
{
  return 1;
}

注意:您的来源中可能有#include,所以在预处理之后,您会从包含的文件中得到很多行,对于问题How to show 'preprocessed' code ignoring includes with GCC,我给出了一个绕过它们的答案。

答案 1 :(得分:3)

默认情况下,Visual Studio已经默认执行此操作,至少从VS2005开始,并且自VS2010开始(要进行this Q / A)要好得多:

enter image description here

编辑:添加为回答另一个答案:

enter image description here

答案 2 :(得分:1)

  

我如何可视化#define的C / C ++?

简短答案:通常,您不能(请注意,您并未定义问题中“可视化”的含义)。您真的想看一下预处理后的表格。使用GCC,您实际上可以使用gcc -C -E来获得它。

作为一个挑衅的例子,__TIME____LINE__preprocessor magic predefined macro__COUNT__也是GCC扩展名)。您可以编码

#if __LINE__ % 2 == 0
printf("hello from line %d\n", __LINE__);
#endif

,其行为取决于该奇怪代码的位置(在偶数行或奇数行)。

好的,这个例子是人为的,但是合法的。通过阅读C11标准n1570进行检查。

您还可以想象一些#if __TIME__[1] == '2',但可能无法编译(因为预处理器表达式无法使用[]索引)。但是,某些if (_TIME__[5] == '2') printf("hello\n");会进行编译(并根据您编译的时间进行不同的优化)。

在实践中,几乎存在与上述代码一样人为设计的代码。一个使用很多预处理器功能的C代码的好例子是Linux kernel source代码(您可能对coccinelle感兴趣,这是一个知道的工具)。构建的第一步(使用make configmake menuconfig)将生成许多标头,这些标头定义了特定内核的功能。这样的配置选项有成千上万(我的/boot/config-4.19.0-3-amd64有7352个配置选项,每个选项都转换为#if中使用的某些预处理器宏)。