假设我在一台linux机器上,运行以下命令。
cpp main.cpp > main_p.cpp
Where main.cpp
是一个c++c文件。我是否可以把 main_p.cpp
并在其他机器上编译执行?还是这个程序是编译器专用的?
编辑1: cpp
是C语言的预处理程序,由C语言中的 cpp(1)
man页面。
预处理器的输出是非常针对系统的,特别是涉及到标准头文件的时候。
特别是标准头文件里面有很多系统特定的东西,因为它们被认为是实现的一部分,因此可以有很多实现特定的东西。
比如下面这个程序。
#include<stdio.h>
int main()
{
printf("hello\n");
return 0;
}
当通过CentOS 7的预处理器时,会产生一个843行的文件。 前几行是这样的。
# 1 "x1.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "x1.c"
# 1 "/usr/include/stdio.h" 1 3 4
# 27 "/usr/include/stdio.h" 3 4
# 1 "/usr/include/features.h" 1 3 4
# 375 "/usr/include/features.h" 3 4
# 1 "/usr/include/sys/cdefs.h" 1 3 4
# 392 "/usr/include/sys/cdefs.h" 3 4
# 1 "/usr/include/bits/wordsize.h" 1 3 4
# 393 "/usr/include/sys/cdefs.h" 2 3 4
# 376 "/usr/include/features.h" 2 3 4
# 399 "/usr/include/features.h" 3 4
# 1 "/usr/include/gnu/stubs.h" 1 3 4
# 10 "/usr/include/gnu/stubs.h" 3 4
# 1 "/usr/include/gnu/stubs-64.h" 1 3 4
# 11 "/usr/include/gnu/stubs.h" 2 3 4
# 400 "/usr/include/features.h" 2 3 4
# 28 "/usr/include/stdio.h" 2 3 4
如果我拿着这个文件试图编译它,使用 cl
命令在Visual Studio中生成一长串错误。
将原始的源文件通过Visual Studio预处理器运行,其输出是这样开始的。
#line 1 "x1.c"
#line 1 "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.10240.0\\ucrt\\stdio.h"
#pragma once
#line 1 "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.10240.0\\ucrt\\corecrt.h"
#pragma once
#line 1 "C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\INCLUDE\\vcruntime.h"
正如你所看到的,输出是非常不同的。 两种编译器都有不同的方式来表示预处理器输出中哪一行源代码对应哪一行。 而这仅仅是差异的一个例子。