わかった、string.hの謎
stricmp問題 - 檜山正幸のキマイラ飼育記 メモ編 の件。
共通インクルードファイルのなかで、#include
#include "common.h" // 間接的かも #ifdef __STRICT_ANSI__ #undef __STRICT_ANSI__ #endif #include <string.h>
となっていると、既にstring.hがインクルードされ、かつインクルードガードがかかってしまう。下のNOT strict ANSIのインクルードは無視される。
#ifdef __STRICT_ANSI__ #undef __STRICT_ANSI__ #endif #include <string.h> #include "common.h" // 間接的かも
↑のように書くと、先にNOT strict ANSIが効くので、stricmpが使える。
まったくもってCPPはカスだ。順序依存で挙動が激しく変わってしまうのが最悪。
[追記]strinc ansiの出処:
g++ に -std=c++0x とか -std=c++11 とかすると、-ansiしたのと同じく、__STRICT_ANSI__ が定義されるようだ。かといって、-std=c++0x しないと、static_assertとか使えなくて困る。
古いMSVCでは、デフォルトでは-ansiではなくて、static_assertなど一部の新しい機能が使える。中途半端だが、ぬるま湯的仕様である意味具合が良いとも言える。