10

それで、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 関数が静的インラインになるのを防ぎます。

4

3 に答える 3

18

C++03 §17.4.2.2/1 は次のように述べています。

C++ 標準ライブラリのエンティティには、外部リンケージがあります。

同じことがCにも当てはまります: C99 §7.1.2/6 は言います:

ライブラリ関数の宣言には、外部リンケージが必要です。

于 2010-08-26T03:06:15.063 に答える
3

OS X<ctype.h>ヘッダーは、標準モードでコンパイルしていないことを確認して、非標準のインライン バージョンを保護します。

適合が必要であることをコンパイラーに伝えなければ、適合は得られません。これは、さまざまな方法ではありますが、ほぼすべてのプラットフォームに当てはまります。

拡張機能のすべての優れた機能とそうでない機能が必要で、厳密な準拠を必要としない場合は_DONT_USE_CTYPE_INLINE_、ヘッダーを含める前に定義することができ、外部リンケージを持つ関数の非インライン バージョンを取得できます。

于 2010-08-27T21:07:15.600 に答える
0

「ctype.h」の代わりに「cctype」(山かっこ内を意味します)を使用するのはどうですか とにかく、古いスタイルのヘッダーだと思います。

于 2010-08-26T03:18:53.040 に答える