gpt4 book ai didi

c++ - 预处理的 C/C++ 文件是否特定于机器?

转载 作者:行者123 更新时间:2023-12-01 14:20:17 24 4
gpt4 key购买 nike

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

cpp main.cpp > main_p.cpp

其中 main.cpp 是一个 c++/c 文件。我可以使用 main_p.cpp 并在任何其他机器上编译/执行它吗?或者这个程序是特定于编译器的?

编辑 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"

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

关于c++ - 预处理的 C/C++ 文件是否特定于机器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61966342/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com