それで、Windows、Linux、およびUNIXのいくつかのバリエーションで問題なくコンパイルできるアプリを手に入れました。最近、問題が発生したときに OSX に移植することにしました。
次のようなテンプレートがあります。
template<int (&F)(int)>
int safe_ctype(unsigned char c) { return F(c); }
上記の入力値が与えられたときに符号拡張が特定の実装をクラッシュさせないようにするという考え0x7f
です。通常、次のように使用されます。
safe_ctype<std::isspace>(ch);
残念ながら、これは OSX (gcc 4.2 を使用) では機能しません。このエラーは、std::isspace
外部リンケージがないことに関係しているため、テンプレートには適用できません。OSX では、ctype.h
ヘッダーにすべての関数 (マクロを介して) がマークされていることがわかりますstatic inline
。
これが私の質問です:
C++ (この場合は C から継承された部分) 標準ライブラリの関数に関連する標準によって、外部リンケージを持たないことが許可されていますか?
編集:
アップルから連絡がありました。どうやら、この動作を制御するマクロを持っているようです。定義_DONT_USE_CTYPE_INLINE_
すると、ctype 関数が静的インラインになるのを防ぎます。