0

私は、標準 C++ コンパイラと先行標準コンパイラの両方でコンパイルできる必要があるユーティリティに取り組んでいます。このコードは、存在するほぼすべての C++ コンパイラでスローされる可能性があり、スローされることになります。

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

ちょっとした背景: このユーティリティは、Perl の Inline::CPP 言語拡張です。拡張子には自動的に が含まれ<iostream>、「.h」が必要かどうか (そしてもちろん、コンパイラが名前空間をサポートしているかどうか) を適切に推測しようとします。しかし、その点では完全とは言えず、この問題によりユーティリティの有用性の幅が狭まります。

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

4

2 に答える 2

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 を作成する必要があります..たとえば、 #include <iostream.h> を含む単純なコンパイル可能な exe にする必要があります。

次に、通常のコードでは

#ifdef PRE_STANDARD_HEADERS

トリックを行うでしょう。

于 2011-12-16T06:34:50.273 に答える
1

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

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

于 2011-12-16T06:38:08.190 に答える