このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

続々・定義済みのプリプロセッサ定数による判断

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;
}