在预处理的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>和
...
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