web-dev-qa-db-ja.com

CompilerTypeで#ifdefする方法は? GCCまたはVC ++

#ifdef Win32と同様に安全な呼び出しにsprintf_sを使用しましたが、今はMinGWでプロジェクトをビルドしたいのですが、今は間違っています。 #ifdef VC++またはそのようなものを使用する必要があります。出来ますか?

16
cnd

Visual Cの定義済みマクロ の「Microsoft固有の定義済みマクロ」の表を参照してください。

_MSC_VERを確認できます。

6
#ifdef __clang__
/*code specific to clang compiler*/
#Elif __GNUC__
/*code for GNU C compiler */
#Elif _MSC_VER
/*usually has the version number in _MSC_VER*/
/*code specific to MSVC compiler*/
#Elif __BORLANDC__
/*code specific to borland compilers*/
#Elif __MINGW32__
/*code specific to mingw compilers*/
#endif
41
Aniket Inge

できれば、ポータブルシンボルの使用に頼る必要があります。これらのシンボルが定義されていない場合があることを理解しているので、標準、コンパイラ、ライブラリ、オペレーティングシステム、およびアーキテクチャに関するプリプロセッサマクロの広範なリストについては Predefプロジェクト を参照してくださいポータブルではありません

ただし、この質問で具体的に言及している関数は、 付録K.3、境界チェックインターフェイス(ライブラリ) の一部としてC11標準に含まれています。

K.3.1.1p2 状態:

__STDC_WANT_LIB_EXT1__がソースファイル内のポイントで整数定数1に展開されるマクロとして定義されている場合、K.3およびその副次句で宣言または定義されている関数、マクロ、およびタイプは、それぞれのヘッダーによって宣言および定義されています。適切なヘッダーが最初に含まれる場所

したがって、__STDC_WANT_LIB_EXT1__をチェックすることを優先し、コンパイラ固有のシンボルが存在しない場合にのみ使用する必要があります。

8
autistic