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

时间:2019-01-01 22:36:52

标签: c++ compilation c-preprocessor clang++

编译器使用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文件,并且始终会出现编译器错误)?

1 个答案:

答案 0 :(得分:3)

行号指令有两个主要用途:

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

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

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

这些目的都不是至关重要的。如果您正在查看汇编程序输出,而行号指令正在为您带来麻烦,请随时将其关闭。