前処理されたC / C ++ファイルはマシン固有ですか?

2020-05-23 c++ c c-preprocessor

私がLinuxマシンを使用していて、次のコマンドを実行するとします。

cpp main.cpp > main_p.cpp

ここで、 main.cppはc ++ / cファイルです。 main_p.cppを取得して他のマシンでコンパイル/実行できますか?または、このプログラムはコンパイラ固有ですか?

編集1: cppは、 cpp(1)マニュアルページで定義されているCプリプロセッサです。

Answers

プリプロセッサの出力は、特に標準のヘッダーファイルが含まれている場合は、システム固有のものです。

特に標準ヘッダーファイルには、実装の一部と見なされているため、システム固有の多くのものが含まれているため、実装固有のものが多くあります。

たとえば、次のプログラム:

#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"

ご覧のとおり、出力は大きく異なります。どちらのコンパイラーも、プリプロセッサー出力の特定の行に対応するソースコード行を示す方法は異なります。そして、それは違いのほんの一例です。

Related