2

Objective-C、具体的にはCocoaは、たとえばNSStringのメソッドのクラスのように可変個引数をサポートします +(NSString *)stringWithFormat:(NSString *)string, ....

さて、私が知りたいのは、可変個引数の引数がメソッドの最後にある必要があるということに従うことができるかどうか、またはメソッドがその後も続行できるかどうかです。

例として、(適切なマクロを使用した)可変個引数メソッドがあるとします。

- (void)setObjects:(id)obj, ... NS_REQUIRES_NIL_TERMINATION;

特定のインデックスで使用したい場合は、次のようにできますか?

- (void)setObjects:(id)obj, ... NS_REQUIRES_NIL_TERMINATION atIndex:(int)index;

私は試しましたが、この特定の例は機能せず、「Expected';」というエラーメッセージが表示されます。メソッドプロトタイプの後」。もちろん、次のように、可変個引数の引数が最後にあることを確認するために、引数をシャッフルすることもできます。

- (void)atIndex:(int)index setObjects:(id)obj, ... NS_REQUIRES_NIL_TERMINATION;

これは確かに機能しますが、Cocoaの命名規則の中で、かなり異質な感じがします。これは私にとって問題です。

ありがとうございました、

4

1 に答える 1

4

可変個引数は最後の引数でなければなりません。これは、Objective-Cのメソッドは、実際には変装した通常のC関数であり、Cは可変引数の後に引数を許可しないためです。

Cが許可しない理由は、Cがサポートする呼び出し規約と関係があります。可変個引数関数を呼び出す場合、最初は可変個引数の引数の数が実際には関数であることがわかりません。その後、さまざまな機能がさまざまな方法でそれを理解できます。Objective Cでは、可変個引数の引数をで終了するのnilが一般的です。このprintf関数は、フォーマット文字列に基づいて渡される引数の数を計算します。この関数は、最初は可変個引数の引数がいくつあるかを知らないため、可変個引数リストの後の引数のメモリ位置を知る方法がありません。

詳細については、「Cの呼び出し規約」を参照してください。

(この制限はC言語の「いぼ」であると考える人もいますが、これは公平です。ただし、ABI互換性が必要なため、この制限に固執しています。C++には可変個引数関数と同じ問題があります。)

于 2011-05-14T15:42:45.527 に答える