C预处理器输出中的行标记是否被编译器使用?

5

编译器生成汇编代码(.s文件)时,C预处理器输出中的行标记(# 1 "donothing.cpp" 2)是否被使用?

我认为它们用于产生编译器错误和调试信息。因此,在尝试跟踪宏的流程时,我可以安全地关闭它们(使用-P)吗?

我正在学习C++和C预处理器。我在许多C++教程中看到,宏通常很难正确编写,并且可能会产生意外的结果。以下是一个预处理器输出示例。C预处理器:预处理器输出

$ 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文件并且总会出现编译器错误)?


2
我已经使用C和C++编程超过35年了,从未需要查看预处理器输出。 - user2100815
@NeilButterworth 调试信息通常足够吗?如果不够,我可以请教您调试编译器错误的一般方法/建议吗? - faulnegx
1
有些人也这样说汇编输出 :q - SasQ
1个回答

7
行号指令有两个主要用途:
  1. 如果编译器遇到错误,它将使用最近的行号指令来确定在错误消息中引用哪个文件和行。

    (甚至可以在生成的代码中使用 #line 指令,使错误消息直接指向原始源文件,而不是中间 C 源文件。)

  2. 如果打开了调试信息 (-g),则行号数据将包含在生成的目标文件的调试部分中。

这些目的都不是必要的。如果您正在查看汇编输出并且行号指令妨碍了您的工作,请随意关闭它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接