我试图更详细地了解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
产生相同的可执行文件。
预处理的C ++代码包含以开头的行,#
以将原始行号和函数调用信息传达给编译器,因此它可以:
这些称为线标记。
#
在这种情况下,A不是合法的C ++代码,因为它表示预处理指令。但是由于文件已经过预处理,因此我们知道这并不意味着要这样做,因此出于上述目的,已在预处理后的输出文件中重用了该文件。
您可以使用-P
选项摆脱这些。从手册页:
-P
禁止在预处理器的输出中生成线标记。当在非C (sic)代码上运行预处理器时,这可能很有用,并将其发送到可能会被行标记混淆的程序。
注意的是,尽管手动页面指C代码,而不是C ++代码(因为手册页是相同的用于g++
与gcc
在这方面),相同的考虑适用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句