C++ 是预处理的C/C++;特定于文件机?

C++ 是预处理的C/C++;特定于文件机?,c++,c,c-preprocessor,C++,C,C Preprocessor,假设我在linux机器上,运行以下命令: cpp main.cpp > main_p.cpp 其中main.cpp是一个c++/c文件。我是否能够使用main_p.cpp并在任何其他机器上编译/执行它?或者这个程序是特定于编译器的 编辑1:cpp是C预处理器,由cpp(1)手册页定义。预处理器输出非常特定于系统,特别是涉及标准头文件时 特别是标准头文件中有许多特定于系统的内容,因为它们被认为是实现的一部分,因此可以有许多特定于实现的内容 例如,以下程序: #include<stdi

假设我在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;
}

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

预处理的输出可能包含编译器或系统特定的内容。特别是如果源文件包含标准头,因为标准头可以自由使用工具链的非标准、特定于实现的功能(例如,某些编译器而非其他编译器支持的特定于编译器的内部函数)或目标系统(例如,特定于操作系统的API)。C和C++标准也只指定了一个实现的整体行为——它们并不妨碍(例如)预处理器使用一些非标准语法与后续的翻译阶段通信。
# 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
#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"