2016-11-28 5 views
2

さて、私は複数のC++バージョンがあることを知っています。私はそれらの違いについて多くのことを知っていませんが、私の質問は次のとおりです。
私はC++ 11でC++アプリケーションを作って、他のバージョンのC++のエラーが出てくるか、それを検出し、そのバージョンで実行しますか?
これは間違っていますか?コンパイル時に定義されていますか?私はまだ私の質問に1つの答えを見つけることはないので、誰かが私に教えてください。C++のバージョンは、exeのバージョンを自動検出しますか?

+7

アプリケーションはコンパイルされ、スタンドアロンです。 javaやpythonとは異なり、C++コンパイルされたプログラムを実行するためにC++は必要ありません。 –

答えて

6

ソースコードを他のマシンにコピーしてそこにコンパイルするか、マシン上でコンパイルして結果のバイナリを別のコンピュータに送信するかによって異なります。

C++はコンパイラによってプロセッサ上で直接実行されるマシンコードに変換されます。互換性のあるプロセッサを搭載したコンピュータであれば、マシンコードを理解できますが、それ以上のものはあります。プログラムは、ファイルシステム、グラフィックアダプタなどとインターフェースする必要があります。この部分は通常、オペレーティングシステムによってさまざまな方法で処理されます。このうちのいくつかがC++ライブラリによって抽象化されていても、オペレーティングシステムへの呼び出しは異なります。

ubuntuのコンパイル済みバイナリは、たとえ両方のコンピュータが同じプロセッサとハードウェアを持っていても、ウィンドウ上では実行されません。

ソースコードを他のマシンにコピーしてそこでコンパイルする(またはクロスコンパイラを使用する)場合は、OS特有の機能を使用しない場合、プログラムをコンパイルして正常に実行する必要があります。

C++バージョンはコンパイルには問題ありませんが、C++ 11ソースコードがあればC++ 11対応コンパイラが必要ですが、プログラムがコンパイルされてもそれ以上は関係ありません。

+0

何もありません。本当に、私は自分自身にupvoteボタンを押す前にそのダウンボトムをなぜ捕まえたのか自分自身に尋ねました:-) – cmaster

+0

ありがとう、私はちょうどdownvotesについて興味があります。 – alain

5

C++はマシンコードにコンパイルされ、次にこのアーキテクチャを持つ任意のコンピュータで実行可能です。 i386またはx64(SSEなどのプロセッサ機能は別にしておく)

Javaの場合、反例を持たせるために、それは異なっています。そこでは、コードはマシンに依存しないバイトコード形式にコンパイルされます。このバイトコード形式は、Java仮想マシン(JVM)によって読み込まれ、理解されます。 JVMはアーキテクチャに対応していなければならず、正しいバージョンをインストールする必要があります。

+2

OSの中には、事態を起こす可能性のある違いもあります。たとえば、標準CライブラリのABIです。そのため、たとえそのマシンがまったく同じハードウェア上で実行されているとしても、Linuxの実行可能ファイルを取り出してWindowsマシン上で実行することはできません。少なくとも同じ実行可能形式を理解しているマシンに範囲を絞り込む必要があります。 – cmaster

+0

特定のOSでコンパイルしている場合にのみ該当します。しかし、コードをメモリに取り込む他の方法もあります。あなたは、ブートローダ、bioses、ファームウェア、OSなどを書くことができます。コードがロードされると、どのC++バージョンに関係なく実行できます。 – Espen

+0

@Epenしかし、そのようなコードは標準Cライブラリにアクセスすることができず、結果として標準Cライブラリに依存する標準C++ライブラリのすべての部分に影響を及ぼします。ファイルI/O、スレッド、 'malloc()'のようなものは、カーネルに依存することなく実装するのは容易ではありません。 C/C++コードではないと主張することができます:言語の特定のサブセットを使用して記述する必要があります。そのレベルでは通常アセンブラのビットを含んでいなければならず、それを標準のC/C++からかなり遠くに動かす必要があります。 – cmaster

5

これは間違っていますか?コンパイル時に定義されていますか?

これはまさに考えです。コードはコンパイルされ、その後は言語バージョンはほとんど無関係です。可能な落とし穴は、新しいC++バージョンに標準のC++ライブラリ(ライブラリではなく、言語そのもの)の変更が含まれている場合です。しかし、そのライブラリの大部分はテンプレートコードなので、とにかく自分のコードと一緒にコンパイルされます。基本的には自分のコードと一緒にファイル.exeに焼き付けられているので、あなたと同じくらいポータブルです。また、CとC++の両方のデザイナーは、古いコードを壊すためにではなく、を大切に扱います。システム自体(標準のCライブラリ)によって提供される部分でさえ、何も破壊しないようにすることができます。

理論上壊れる可能性があるものの、純粋なC++コードは、コンパイルされたマシンと同じ.exeフォーマットを理解しているすべてのマシンで正常に動作するはずです。

関連する問題