この質問は、次のいずれとも同じではありません。
- Visual C++ Studio/Express を厳格な ANSI モードに設定する
- Microsoft の Visual C++ コンパイラを使用する場合、gcc の -pedantic に相当するものはありますか?
私は Windows 7 と Visual Studio Express 2012 を実行していますが、どちらもこの質問への回答に影響を与えることはないと思います。
tl;dr 次の math.h からの抜粋の影響を最も適切に打ち消す/防止する/許容する方法を教えてください。
#if !__STDC__
/* Non-ANSI names for compatibility */
#define DOMAIN _DOMAIN
#define SING _SING
#define OVERFLOW _OVERFLOW
#define UNDERFLOW _UNDERFLOW
#define TLOSS _TLOSS
#define PLOSS _PLOSS
#define matherr _matherr
背景: 私は趣味のテキストベースの C++ プロジェクトを書いていますが、その全体的な目標はこの質問の範囲をはるかに超えています。私はGNU Makeを使用して(親しみやすさと移植性のために)Cygwin g ++とcl.exeの両方でコンパイルし、厳密に標準に準拠した環境を想定しています...これまでのところ。私は、Windows がそのような想定を単に許可していないと考え始めています。
メンバーにOVERFLOW
andが含まれる列挙型がありUNDERFLOW
ます。以下に説明する問題により、これらの名前を変更せざるを得なくなる恐れがありますが、Windows ヘッダー ファイルなどの外部の影響にもかかわらず、私の目的に最も適しているため、そのままにしておくことをお勧めします。
GCC、Visual C++、および Mac OS X のヘッダー ファイル (llvm-gcc とは無関係) はすべて、デフォルトで math.h で、他の非標準マクロの中でOVERFLOW
およびを定義します。UNDERFLOW
- GCCには、これらの定義を完全に防止するための文書化された手段がいくつかあります。
- Mac OS X には、同じことを行う文書化されていない方法がいくつかあります。そのうちの 1 つ (
_POSIX_C_SOURCE
) は、GCC のドキュメントと一致しています。(Apple のドキュメントの不足を補うためにこれについて言及します。私はこれらの識別子の歴史を持っています。) - MSDNは、Visual C++ でいくつかの非標準マクロの定義を防止する (マクロを介した) 手段として、/u コマンド ライン オプションを文書化しています。この質問の冒頭で示したように、マクロはとの定義も防ぎます。
__STDC__
__STDC__
OVERFLOW
UNDERFLOW
/u スイッチを使用すると、懸念していた定義が妨げられることがわかったので、それをメイクファイルに追加しました。しかし、crtdefs.h の 44 行目から新しいエラーが発生しました。
error C1189: Only Win32 target supported!
これは、_WIN32
が定義されなくなったためです。少し検索したところ、crtdefs.h が Windows Driver Development Kit に関連していることがわかりました。私はドライバーを開発していません。どういうわけかそのヘッダーを使用しないことはできますか? または、非標準の Windows の動作を許容するために、列挙型メンバーの名前を変更する必要がありますか?