Preprocessed C/C++ 文件是否特定于机器?
Is a Preprocessed C/C++ file machine-specific?
假设我在 linux 机器上,我 运行 执行以下命令:
cpp main.cpp > main_p.cpp
其中 main.cpp
是一个 c++/c 文件。我可以在任何其他机器上使用 main_p.cpp
和 compile/execute 吗?或者这个程序是特定于编译器的?
编辑 1: cpp
是 C 预处理器,如 cpp(1)
手册页所定义。
预处理器输出在很大程度上是系统特定的,尤其是在涉及标准头文件的情况下。
标准头文件特别有很多系统特定的东西,因为它们被认为是实现的一部分,因此可以有很多实现特定的东西。
例如下面的程序:
#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
如果我使用此生成的文件并尝试使用 Visual Studio 中的 cl
命令编译它,则会生成一长串错误。
通过 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"
如您所见,输出非常不同。两种编译器都有不同的方式来表示哪个源代码行对应于预处理器输出中的给定行。这只是差异的一个例子。
假设我在 linux 机器上,我 运行 执行以下命令:
cpp main.cpp > main_p.cpp
其中 main.cpp
是一个 c++/c 文件。我可以在任何其他机器上使用 main_p.cpp
和 compile/execute 吗?或者这个程序是特定于编译器的?
编辑 1: cpp
是 C 预处理器,如 cpp(1)
手册页所定义。
预处理器输出在很大程度上是系统特定的,尤其是在涉及标准头文件的情况下。
标准头文件特别有很多系统特定的东西,因为它们被认为是实现的一部分,因此可以有很多实现特定的东西。
例如下面的程序:
#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
如果我使用此生成的文件并尝试使用 Visual Studio 中的 cl
命令编译它,则会生成一长串错误。
通过 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"
如您所见,输出非常不同。两种编译器都有不同的方式来表示哪个源代码行对应于预处理器输出中的给定行。这只是差异的一个例子。