3

大規模なクロスプラットフォームコードベースで C++11 を使用するための移行を開始したいと考えています。主な問題は、C++11 サポートのレベルが、使用されるコンパイラーによって異なることです。

コード全体にマクロを散らかす以外に、この移行を容易にする方法についての例/提案はありますか? 特定の機能のテクニックを提供してください。例えば:

// cpp11compat.h

// For compilers that do not have 'nullptr', we will define it as 'NULL'.
// Any misuses of 'nullptr' will be caught by C++11 compliant compilers.
// Obviously, this won't fix anything that depends on the type 'nullptr_t'
//
#ifdef STUPID_SUN_COMPILER
#define nullptr NULL
#endif

考え?

4

2 に答える 2

1

現在のコンパイラによる C++11 機能の最大の共通分母を見つけることから始めることをお勧めします。調査については、http: //wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport 参照してください。他のほとんどのプラットフォームがサポートしている特定の機能をサポートしていないプラットフォーム用 (例: )。autodecltypenullptr

すべての構成ファイルのファイル構成については、Boost.Configのソース コードを確認することをお勧めします。これには、プラットフォームと目的ごとに並べられたいくつかのディレクトリが含まれています。たとえば、config/platform/irix.hpp には、Irix のプラットフォーム固有のものすべてが含まれています。

EDIT : 言語機能のエミュレーションを行うもう 1 つの良い方法は、言語機能エミュレーションタグの Boost ライブラリを調べることです。それらには、Move、Foreach、以前の Lambda などのライブラリが含まれており、標準の C++11 機能と非常によく似た (必ずしも完全に同じというわけではありませんが) 構文を持っています。これにより、Boost にプラットフォームの互換性を心配させることができます。

于 2012-05-12T19:07:35.377 に答える
0

標準の発行から少し時間が経過しました。おそらくブーストによってほとんどすべての C++11 機能に到達できるでしょうが、2 回移行することになるため、すでにこの道を進んでいない限り、今年はおそらくそのような種類の移行を開始するのに最適なタイミングではありません。

そのため、移行を開始する前に、コンパイラ ベンダーに 1 ~ 2 年猶予を与えることをお勧めします。一方、コード ベース全体で C++11 が非常に重要であると思われる場合は、更新されたコンパイラが表示されない可能性が高い放棄されたプラットフォームのサポートを停止してください。

(実際、大規模なコードベースを言語標準の次のバージョンに完全に移行しないことはまったく問題なく一般的です、それは現在の言い方ではあなたの質問には関係ありません。)

于 2012-05-12T20:03:04.470 に答える