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

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

わかった、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など一部の新しい機能が使える。中途半端だが、ぬるま湯的仕様である意味具合が良いとも言える。

しょうがないから、-std=c++0x で -U__STRICT_ANSI__ か。
[/追記]