预处理的C ++代码中#的含义是什么?

马丁·德罗兹迪克

我试图更详细地了解C ++编译过程,因此尝试查看C ++预处理器的结果如何:

#include <iostream>

int main()
{
    // I am a comment!
    std::cout << "Hi!" << std::endl;
    return 0;
}

然后我跑了:

g++ -E main.cpp > preprocessed

运行预处理器

输出是一个很长的文件,因为<iostream>标头及其包含的所有内容都得到了扩展。但是,文件结尾看起来像这样:

...
namespace std __attribute__ ((__visibility__ ("default")))
{

# 60 "/usr/include/c++/4.9/iostream" 3
  extern istream cin;
  extern ostream cout;
  extern ostream cerr;
  extern ostream clog;


  extern wistream wcin;
  extern wostream wcout;
  extern wostream wcerr;
  extern wostream wclog;




  static ios_base::Init __ioinit;


}
# 2 "main.cpp" 2

int main()
{

    std::cout << "Hi!" << std::endl;
    return 0;
}

预期该注释消失了,但是预处理器在以#开头的行上添加了一些信息

行以#合法的C ++开头吗?我认为#的唯一目的是指定预处理程序指令。我以为#是指定评论的一种深奥方式,但是这段代码:

#include <iostream>

int main()
{
    # I am something that follows the hash symbol.
    std::cout << "Hi!" << std::endl;
    return 0;
}

不编译。


编辑:

显然,#个符号在功能范围之外是可以的:

g++ -E main.cpp > preprocessed.cpp
g++ preprocessed.cpp -o preprocessed

产生相同的可执行文件。

bl

预处理的C ++代码包含以开头的行,#以将原始行号和函数调用信息传达给编译器,因此它可以:

  • 在适当的行产生错误信息
  • 产生与行号链接的调试信息

这些称为线标记

#在这种情况下,A不是合法的C ++代码,因为它表示预处理指令。但是由于文件已经过预处理,因此我们知道这并不意味着要这样做,因此出于上述目的,已在预处理后的输出文件中重用了该文件。

您可以使用-P选项摆脱这些从手册页:

-P禁止在预处理器的输出中生成线标记。当在非C (sic)代码上运行预处理器时,这可能很有用,并将其发送到可能会被行标记混淆的程序。

注意的是,尽管手动页面指C代码,而不是C ++代码(因为手册页是相同的用于g++gcc在这方面),相同的考虑适用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++中的预处理器宏重写函数定义

来自分类Dev

Bash中类似C的预处理器宏

来自分类Dev

使用C预处理程序进行代码清除

来自分类Dev

C ++ 11预处理器有什么新功能?

来自分类Dev

C99预处理器中的static_if

来自分类Dev

C预处理器中是否存在逻辑短路?

来自分类Dev

C#预处理程序指令中运算符的优先级是什么?

来自分类Dev

C ++预处理程序位置代码:: blocks?

来自分类Dev

C ++中“ Class <>”的含义是什么?

来自分类Dev

C预处理器中的嵌套##运算符

来自分类Dev

C ++中void * volatile *的含义是什么

来自分类Dev

何时使用预处理器在C中定义函数?

来自分类Dev

如何预处理pycparser的C源代码

来自分类Dev

C预处理文件中的这些陌生行是什么?

来自分类Dev

使用预处理器指令从C代码进行AST

来自分类Dev

为什么C预处理程序认为枚举值相等?

来自分类Dev

使用gcc或cpp预处理C代码而不解析宏

来自分类Dev

IDE for C项目中可识别预处理程序的代码

来自分类Dev

C中的预处理程序指令

来自分类Dev

c ++中的预处理程序指令:以下代码的输出是什么?

来自分类Dev

使用C预处理器生成样板代码

来自分类Dev

了解C预处理器宏的输出与行代码

来自分类Dev

C ++预处理程序位置代码:: blocks?

来自分类Dev

解释C预处理程序代码

来自分类Dev

C ++中“ Class <>”的含义是什么?

来自分类Dev

C ++自动预处理程序代码生成

来自分类Dev

在C qsort中此代码的含义是什么?

来自分类Dev

C#中〜的含义是什么

来自分类Dev

预处理器跳过 C 中的部分代码