C++ gcc预处理的输出行格式为哈希符号+;数字“quot;”1“;什么意思?
在为CUDA的编译器编写错误报告时,我发现gcc的预处理步骤出现了这种奇怪的行为。我目前使用GCC4.8.2 测试文件:Test.cppC++ gcc预处理的输出行格式为哈希符号+;数字“quot;”1“;什么意思?,c++,gcc,c-preprocessor,C++,Gcc,C Preprocessor,在为CUDA的编译器编写错误报告时,我发现gcc的预处理步骤出现了这种奇怪的行为。我目前使用GCC4.8.2 测试文件:Test.cpp #包括 int main() { INTA=1; 断言(a>=0); 断言(a) >= 0); } 命令 GCC—E-X-C++(M64)-G-O“测试”CPP4.II“”测试CPP“< /P>” 结果文件:test.cpp4.ii #2“test.cpp”2 int main() { INTA=1; ((a>=0)?静态类型转换(0):\u断言\u失败(
#包括
int main()
{
INTA=1;
断言(a>=0);
断言(a)
>= 0);
}
命令
GCC—E-X-C++(M64)-G-O“测试”CPP4.II“”测试CPP“< /P>” 结果文件:test.cpp4.ii
#2“test.cpp”2
int main()
{
INTA=1;
((a>=0)?静态类型转换(0):\u断言\u失败(“a>=0”,“test.cpp”,6,“PRETTY\u函数”);
((a>=0)?静态转换(0):\u断言\u失败(“a>=0”,
“test.cpp”
#7“测试cpp”3 4
,
8.
#7“测试cpp”3 4
,uuu漂亮函数uuu)
;
多行断言的处理方式似乎有所不同,导致出现了这些#7“test.cpp”34行。这到底意味着什么
更新
显然,GCC4.7给出了#7“test.cpp”
(没有最后2个数字)。它看起来像行标记。正如您可能已经注意到的,原始文件和预处理文件中的行号之间没有细微的关系。预处理输入中的#7
表明下一行的源是原始文件中的第7行(名为test.cpp)
34
是标志,表示“从系统头进行宏扩展”和extern“C”
非常感谢您的澄清!更多信息:存储原始行号有助于编译器生成错误消息,指示原始行号source@MattMcNabbANSI对此有多少说法?我想它属于C99中的#非指令语法,但是我找不到有什么语义吗?猜猜它只是没有定义,实现可以像GCC在这里那样随意扩展吗?@CiroSantilli六四事件法轮功纳米比亚胡海峰 在ISO C中,
和下一个标记之间的空格不重要,#7
将是一个错误;因此这是一个gcc扩展(但这很好,因为它只出现在中间输出中;只要符合要求的程序仍然正确编译,就允许扩展)@Mattmcnab为什么#非指令
语法不适用于此处?N256 6.10预处理指令。可能与
#include <assert.h>
int main()
{
int a = 1;
assert (a >= 0);
assert (a
>= 0);
}
# 2 "test.cpp" 2
int main()
{
int a = 1;
((a >= 0) ? static_cast<void> (0) : __assert_fail ("a >= 0", "test.cpp", 6, __PRETTY_FUNCTION__));
((a >= 0) ? static_cast<void> (0) : __assert_fail ("a >= 0",
"test.cpp"
# 7 "test.cpp" 3 4
,
8
# 7 "test.cpp" 3 4
, __PRETTY_FUNCTION__))
;