2016-04-17 4 views
7

インターネットの周りには、移植可能なC++で書かれていると主張している図書館(あたかも非公式なものであるかのように) があります。「ポータブルC++」とは何ですか?

ポータブルC++とは何かを正確に定義していますか?その場合、それは何ですか?

私はポータブルコードを書くための一般的な慣行を求めていませんが、本当に何かがある場合は "portable C++"と呼ぶことができます。

+2

特に、コンパイラ固有の拡張機能を使用しないコードでも、動作しても未定義の動作に依存することはありません。 –

+4

iso標準に準拠したコードでは、os呼び出しや特定のCPUのインラインアセンブリーなどのプラットフォーム固有のものを使用しないため、標準準拠のコンパイラーを使用する任意のプラットフォームで実行をコンパイルすることができます。 – Unimportant

+1

本当の疑問は、 "携帯ではないC++"だと思います:-) –

答えて

8

ポータブルC++は非常にあいまいです。

あなたは移植性を実現したい場合は、唯一のC++の標準ライブラリを使用して、ノープラットフォーム固有のコード(のようなread、Linux上writeシステムコール)、(GCCのC/C++の拡張機能など)がないコンパイラ固有の組み込み関数、または特定のCPUのインラインアセンブリ

これは「ポータブル」ではないことに注意してください。幅広いプラットフォーム(組み込み関数を含む)でC++をコンパイルすることはできますが、これらのプラットフォームのすべてが標準C++ライブラリとともに出荷されるわけではありません。また、最新かつ最高のC++機能(C++ 11、C++ 14心に来る)。

しかし、実際の移植性を達成することはできませんが、最も一般的なプラットフォームでの移植性を実現したり、これらのXプラットフォームをサポートしたり、それぞれのプラットフォーム固有のソリューションを構築したりすることができます、結果は多くの#ifdef OS1コードになります)。

+2

他のPOSIXシステム*に移植可能な*がある場合は、大きなグレーの領域があります。 Windowsは奇妙な鳥です。コンパイラ特有の機能を避けるために必要な注意と注意があります。 – tadman

+0

はい、本当です。 POSIXは、今日のオペレーティングシステムでは移植可能です。 Windowsの場合でも(古いものであってもPOSIXサブシステムがあります)、WinAPI呼び出し(MinGW、Cygwinなど)にPOSIX呼び出しを渡すライブラリがたくさんあります。 – Leandros

+1

ブーストはポータブルとも見なされませんか?ライブラリが移植性を主張しているならば、あなたは標準に自分自身を限定する必要はありません。 – Default

4

ポータブルC++コードは、(ほとんどの)プラットフォームやあらゆる実装のためにコンパイルできることを意味します。目標があるプログラムが

    • 上の異なるオペレーティングシステム(Windows、Linux、OSX)
    • 異なるアーキテクチャ(x86またはx86-64の、チタン、SPARC、アーム)
    • を実行すべきかどう だから、それは重要ではないのです
    • 異なるランタイムライブラリ/コンパイラ(gccの、打ち鳴らす、MSVC)

    あなたは多くの側面 を考慮する必要があり、これを達成するには - のみ標準ライブラリ を使用し、実装定義されたAPIと動作を使用しないでください - そのcharは8ビット、または負の整数は、2補数およびオーバーフローありましたかintは32ビット長であるというように

    問題であることのように、あなたは多くの場合のものを使用する必要があり、アーキテクチャ定義された仮定と動作を使用しないでください。 C++にはネットワークインタフェースのような標準はありません。したがって、ライブラリは、プリプロセッサによって選択された、最も一般的なシステムに対して異なる特定のソリューションを使用することによって、この問題を回避しようとします。

    ポータビリティは実際には実用的ではないため、常にコンテキスト内で見られることがわかります。たとえば、C++ 11準拠のコンパイラで移植可能なC++コード(ほとんどのコンパイラは100%ではありません、MSVC 12/2013を参照)、またはC++ 11準拠のコンパイラとPOSIXシステム用の移植性があります(すべてのUNIXシステムでこれを使って)。等々。

  • +0

    'char'が8ビットではないシステムをまだ使用していますか?これはC++ 14でも許可されていますか?歴史的な理由から、これはまさに何かになるかもしれませんが、実際にはそれは事実ですか? – tadman

    +0

    @ tadman誰かがこれをもう一度持ち出すことを知っていました。 C++とCの標準では、 'char'の正確な長さについては何も述べていません。アーキテクチャについては、 'CHAR_BIT!= 8'はhttp://stackoverflow.com/a/6972551/3537677を参照してください。 – Superlokkus

    +0

    これはハードウェアの一覧ですので、雷によって打たれたり、パワーボールジャックポットに勝つことを心配する必要があります。そのためのコードを書いてください。私たちが気づかないかもしれない共通のものが非標準の 'char'サイズを持っているかどうかを尋ねていました。いくつかの組み込みプロセッサやDSPがそうであるように。 – tadman