2011-12-16 21 views
0

私は、標準C++コンパイラと標準コンパイラの両方でコンパイルできるようにする必要があるユーティリティを開発中です。このコードは、存在するC++コンパイラについても投げられる可能性があります。コンパイラが移植可能かどうかを移植可能に検出する方法<iostream> vs <iostream.h>

ターゲットコンパイラが.h拡張子の有無にかかわらずヘッダーファイルをサポートしているかどうかを堅牢かつ移植可能に判断する手段を探しています。また、名前空間がサポートされているかどうかを検出する必要があります。これらのニーズの両方が可能である場合とできない場合があります。

少し背景:このユーティリティはPerlのInline :: CPP言語拡張です。拡張子は自動的に<iostream>を含み、 '.h'が必要かどうかを推測します(もちろん、コンパイラが名前空間をサポートしているかどうかに関係なく)。その点では完璧ではありませんが、この問題はユーティリティの有用性の幅を狭めています。

質問を繰り返す:コンパイラが<iostream>などの標準ヘッダー、または<iostream.h>などの標準より前のヘッダーをサポートしているかどうかを移植可能に検出するにはどうすればよいですか?

+3

おそらく、 '_MSC_VER'のようなプリプロセッサ分岐を行う必要があるでしょう。また、過去10年間のコンパイラを使用するように指示することもできます。 – GManNickG

+1

これは、コンパイラのバージョンを検出することと、それに基づいて推測をハードコードすること以外の、コンパイル/前処理時には不可能です。 configureスクリプトの作成について考えましたか? – Dani

+0

これは私が恐れていたことです:何十というコンパイラの指紋(_MSC_VERなど)を決定し、プリプロセッサディレクティブの迷路を設定する必要があります。 – DavidO

答えて

5

コードには含まれていませんが、ビルド/構成システムには含まれていません。たとえばCMakeでは、try_compileを使用してサンプルファイルを提供することができます。

... 
try_compile(PRE_STANDARD_HEADERS tmp_builds pre_standard_headers_test.cpp) 
if (${PRE_STANDARD_HEADERS}) 
    add_definitions(-D PRE_STANDARD_HEADERS) 
endif() 

あなたはそのpre_standard_headers_test.cpp ..例えば<でiostream.h >を#include単純なコンパイルexeファイルを作成する必要があると思います。

は、その後、あなたの通常のコードにだけ

#ifdef PRE_STANDARD_HEADERS 

は、トリックを行うだろう。

+0

これは本質的に私が従ったアプローチです。 Perl "Makefile.PL"(プログラムでmakefileをビルドするスクリプト)の中で私はいくつかのコードをテストコンパイルしました。どのコードがコンパイルされているかに基づいて、makefileとPerlモジュールの構成設定内で適切な設定を正確にコンパイルすることができました。 – DavidO

+0

Coolness、DavidOという実用的なソリューションが得られてうれしいです。たくさんのC++をやるつもりなら、私は個人的にCMake + CTest + CPackの学習に少し時間を投資することをお勧めします。それはかなり急な傾斜曲線を持っていますが、あなたが物を作るときに魔法の力を持つようなものです。私はこの1時間のvidを見てから始まった/興味を持っていた:http://www.youtube.com/watch?v=8Ut9o4OdSC0はその後、参照用ドキュメントにちょうど続き、記事を完成させた:http://www.cmake.org/ cmake/help/v2.8.8/cmake.html – matiu

1

Linuxやその他のUNIXフレンドリープラットフォームの標準的なアプローチは、configure scriptを使用することです。このスクリプトは、Makefileとconfig.hヘッダファイルを出力として生成します。このファイルは、コードが利用可能な場合に依存する可能性のあるコンパイラ機能をオンまたはオフにします。

Windowsの場合、Visual Studio用のソリューションファイルとプロジェクトファイルを事前生成されたconfig.hヘッダーファイルとともに提供することが期待されます。

関連する問題