gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:17:11 25 4
gpt4 key购买 nike

编译器使用 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),行号数据将包含在生成的目标文件的调试部分中。

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

关于c++ - 编译器是否使用 C 预处理器输出中的行标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53999485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com