【问题标题】:Are line-markers in C preprocessor output used by compiler?编译器是否使用 C 预处理器输出中的行标记?
【发布时间】:2019-05-28 16:43:01
【问题描述】:

编译器是否使用 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 文件并且总是存在编译器错误)?

【问题讨论】:

  • 我已经用 C 和 C++ 编程超过 35 年了,我从来不需要查看预处理器的输出。
  • @NeilButterworth 调试信息一般够用吗?如果没有,我可以询问调试编译器错误的一般方法/建议吗?

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


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 2020-06-08
    • 2020-10-12
    相关资源
    最近更新 更多