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

Are line-markers in C preprocessor output used by compiler?

C 预处理器输出中的行标记 (# 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 文件并且总是存在编译器错误)?

行号指令有两个主要目的:

  1. 如果编译器遇到错误,它会使用最近的行号指令来确定错误消息中引用的文件和行。

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

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

这些目的都不重要。如果您正在查看汇编器输出并且行号指令妨碍了您,请随时将其关闭。