预处理的 C/C++ 文件是否特定于计算机?

Is a Preprocessed C/C++ file machine-specific?

本文关键字:计算机 是否 文件 C++ 预处理      更新时间:2023-10-16

假设我在一台 Linux 机器上,我运行以下命令:

cpp main.cpp > main_p.cpp

其中main.cpp是 c++/c 文件。我可以获取main_p.cpp并在任何其他机器上编译/执行它吗?还是此程序编译器特定于?

Edit 1:cpp是 C 预处理器,由cpp(1)手册页定义。

预处理器输出非常特定于系统,尤其是在涉及标准头文件的情况下。

特别是标准头文件有很多特定于系统的东西,因为它们被认为是实现的一部分,因此可以有很多特定于实现的东西。

例如,以下程序:

#include<stdio.h>
int main()
{
printf("hellon");
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"

如您所见,输出非常不同。 两个编译器都有不同的方法来表示哪个源代码行对应于预处理器输出中的给定行。 这只是差异的一个例子。