Objective-C では__typeof__(obj)
、ブロックなどを扱うときによく使用し__typeof(obj)
ますtypeof(obj)
。
いつどれを使う?
Objective-C では__typeof__(obj)
、ブロックなどを扱うときによく使用し__typeof(obj)
ますtypeof(obj)
。
いつどれを使う?
__typeof__()
および__typeof()
は、C 言語に対するコンパイラ固有の拡張機能です。これは、標準の C にはそのような演算子が含まれていないためです。標準 C では、コンパイラが言語拡張機能の前に 2 つのアンダースコアを付ける必要があります (これが、独自の関数や変数などに対して決してそうしない理由でもあります)。
typeof()
はまったく同じですが、最新のすべてのコンパイラがサポートしていることを理解して、ウィンドウの外にアンダースコアをスローします。(実際、今考えてみると、Visual C++ はそうではないかもしれません。decltype()
ただし、サポートはしており、通常は と同じ動作を提供しますtypeof()
。)
3 つすべてが同じことを意味しますが、いずれも標準 C ではないため、準拠するコンパイラは意味を異なるものにすることを選択する場合があります。
他の人が述べたように、それぞれのコンパイラでさまざまなサポートを持つCtypeof()
の拡張です。iOS または Mac アプリ用の Objective-C を作成している場合は、 Clangコンパイラ
を使用してアプリをコンパイルする可能性が高くなります。
Clang は の使用をサポートしていますがtypeof()
、技術的には、C 言語の方言がgnu*タイプに設定されている場合に使用されます。ただし、 c*言語とgnu*言語の方言__typeof__()
の両方でサポートされています - 詳細は Clangドキュメントを参照してください。
Xcode でコードを記述している場合、C 言語方言のデフォルト設定は GNU99 のように見え、'asm' 'inline' 'typeof'を許可するオプションはYesに設定されているため、使用しても何も表示されtypeof()
ません。問題。
Clang コンパイラを使用するときに(ほぼ間違いなく) 安全になりたい場合は、 __typeof__()
. これにより、コンパイルに使用されている C 言語方言が変更された場合や、誰かが'typeof'の許可をオフにすることを決定した場合でも、影響を受けません。
これが役立つことを願っています:
-ansi およびさまざまな -std オプションは、特定のキーワードを無効にします。これは、GNU C 拡張機能、または ISO C プログラムを含むすべてのプログラムで使用できる汎用ヘッダー ファイルを使用する場合に問題を引き起こします。キーワード asm、typeof、および inline は、-ansi または -std でコンパイルされたプログラムでは使用できません (ただし、inline は -std=c99 または -std=c11 でコンパイルされたプログラムで使用できます)。ISO C99 キーワードの restrict は、-std=gnu99 (最終的にはこれがデフォルトになります) または -std=c99 (または同等の -std=iso9899:1999)、またはそれ以降の標準バージョンのオプションが使用される場合にのみ使用できます。
これらの問題を解決する方法は、問題のある各キーワードの最初と最後に「__」を付けることです。たとえば、asm の代わりに __asm__ を使用し、inline の代わりに __inline__ を使用します。
http://gcc.gnu.org/onlinedocs/gcc/Alternate-Keywords.html#Alternate-Keywords
https://clang.llvm.org/docs/UsersManual.html#c-language-features