编译器使用C预处理程序输出中的linemarkers(# 1 "donothing.cpp" 2
)来生成汇编器(.s)文件吗?
我希望它们用于产生编译器错误和调试信息。这样我就可以安全地(通过-P
关闭这些功能,同时尝试遵循宏的流程吗?
我正在学习C ++和C预处理程序。我在许多C ++教程中都读到,宏通常很难正确编写,并且会产生意想不到的结果。这是预处理器示例输出。 The C Preprocessor: Preprocessor Output
$ g++ -Wall -std=c++11 -E donothing.cpp
# 1 "donothing.cpp"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 391 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "donothing.cpp" 2
int main()
{
return 0;
}
$ g++ -Wall -std=c++11 -E donothing.cpp -P
int main()
{
return 0;
}
查看预处理程序输出是否是调试编译器错误的方法? c / c ++开发人员还可以如何调试宏(因为我希望人们非常频繁地使用多个.cpp文件,并且始终会出现编译器错误)?
答案 0 :(得分:3)
行号指令有两个主要用途:
如果编译器遇到错误,它将使用最新的行号指令来确定错误消息中要引用的文件和行。
(#line
指令甚至可以在生成的代码中使用,以允许错误消息直接指向原始源文件,而不是指向中间C源文件。)
如果打开调试信息(-g
),则行号数据将包含在生成的目标文件的调试部分中。
这些目的都不是至关重要的。如果您正在查看汇编程序输出,而行号指令正在为您带来麻烦,请随时将其关闭。