在预处理的C++;密码? 我试图更详细地理解C++编译过程,所以我尝试看看C++预处理器的结果是什么样子: #include <iostream> int main() { // I am a comment! std::cout << "Hi!" << std::endl; return 0; }

在预处理的C++;密码? 我试图更详细地理解C++编译过程,所以我尝试看看C++预处理器的结果是什么样子: #include <iostream> int main() { // I am a comment! std::cout << "Hi!" << std::endl; return 0; },c++,c-preprocessor,C++,C Preprocessor,只需运行预处理器即可 输出是一个很长的文件,因为头与它包含的所有内容一起被扩展。但是,文件的结尾如下所示: ... 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;

只需运行预处理器即可

输出是一个很长的文件,因为
头与它包含的所有内容一起被扩展。但是,文件的结尾如下所示:

...
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;
}

产生相同的可执行文件。

< P>预处理的C++代码包含从< <代码> > <代码>开始的代码行,将原始行数和函数调用信息传送给编译器,因此可以:

  • 在适当的行生成错误信息
  • 生成与行号链接的调试信息
这些被称为线标记

A<代码> < < /C> >不是合法的C++代码,因为它表示预处理器指令。但是,由于文件已经过预处理,我们知道这并不意味着,因此,出于上述目的,它将在预处理的输出文件中重用

您可以使用
-p
选项来消除这些问题。从手册页:

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


注意,虽然手册页引用C代码而不是C++代码(因为手册页对于<代码> G++< /COD>和 GCC < /代码>在这方面是相同的),但同样的考虑也适用。

它设置文件和行代码偏移,下面的代码段来自于,以获得错误消息。你可以用-E-P来编译它们。AfICT,C++标准定义了逻辑编译步骤,但是这些步骤之间中间表示的格式是实现定义的,因此它不必是“合法”的C++。
...
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;
}
#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