我正在寻找可视化#define效果的方法-例如,编译器未看到的代码以不同的颜色显示。
主要是视觉工作室,但是很高兴了解其他环境吗? 理想情况下,编译器也可以看到但不会运行的代码。
答案 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)
答案 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 config
或make menuconfig
)将生成许多标头,这些标头定义了特定内核的功能。这样的配置选项有成千上万(我的/boot/config-4.19.0-3-amd64
有7352个配置选项,每个选项都转换为#if
中使用的某些预处理器宏)。