続々・定義済みのプリプロセッサ定数による判断
http://d.hatena.ne.jp/m-hiyama-memo/20160206/1454751537:tileの続き。
次のようにした。やっぱりset_flagsの中身はコピペの連続。__GNUC__は、!_MSC_VER に吸収されるからドウデモいい定数。
[追記]
「__GNUC__は、!_MSC_VER に吸収される」ってあたりはけっこう論理を使うね。
- __GNUC__ && _MSC_VER はあり得ないと仮定している。シーケントなら、__GNUC__, _MSC_VER ⇒ ⊥。
- これから、__GNUC__ ⇒ !_MSC_VER が推論される。
- !_MSC_VER ⇒ X を追加すると、__GNUC__ ⇒ X は推論されるから、!_MSC_VER ⇒ X だけで十分。
- したがって、__GNUC__ ⇒ X というシーケントは不要で、その前提の __GNUC__ も不要。
[/追記]
#include <stdio.h> #include <string> #include <map> using namespace std; map<string, bool> macroConst; void set_flags() { #if defined(NDEBUG) macroConst["NDEBUG"] = true; #else macroConst["NDEBUG"] = false; #endif #if defined(_WIN32) macroConst["_WIN32"] = true; #else macroConst["_WIN32"] = false; #endif #if defined(_POSIX_SOURCE) macroConst["_POSIX_SOURCE"] = true; #else macroConst["_POSIX_SOURCE"] = false; #endif #if defined(_ANSI_SOURCE) macroConst["_ANSI_SOURCE"] = true; #else macroConst["_ANSI_SOURCE"] = false; #endif #if defined(_MSC_VER) macroConst["_MSC_VER"] = true; #else macroConst["_MSC_VER"] = false; #endif #if defined(_MFC_VER) macroConst["_MFC_VER"] = true; #else macroConst["_MFC_VER"] = false; #endif #if defined(__GNUC__) macroConst["__GNUC__"] = true; #else macroConst["__GNUC__"] = false; #endif #if defined(NO_WIN32) macroConst["NO_WIN32"] = true; #else macroConst["NO_WIN32"] = false; #endif #if defined(NO_MFC) macroConst["NO_MFC"] = true; #else macroConst["NO_MFC"] = false; #endif } int main() { set_flags(); for (map<string, bool>::iterator itr = macroConst.begin(), end = macroConst.end(); itr != end; itr++){ string key = itr->first; bool defined = itr->second; printf("%s : %s\n", key.c_str(), defined? "Defined": "Undefined"); } return 0; }