2009-09-03 5 views
2

誰かがCで関数のための可変アリティを実装する方法を知っていますか?例えばCの可変アリティは?

、加算機能:

合計(1,2,3,4 ...)。 (可変数の引数を取る)

ありがとう!

+1

変数アリティを?機能? –

+0

もっと具体的なものをお探しください。サンプルコード(コンパイルする必要はなく、達成しようとしていることを実証するだけで、それを見たいと思う方法は非常に便利です)。 –

+0

パリティ、おそらく?どんな状況で?もっとお聞かせください。 – dmckee

答えて

14

intの可変パラメータリストです。必要に応じてタイプを調整してください:

#include <stdarg.h> 

void myfunc(int firstarg, ...) 
{ 
    va_list v; 
    int i = firstarg; 

    va_start(v, firstarg); 
    while(i != -1) 
    { 
     // do things 
     i = va_arg(v, int); 
    } 

    va_end(v); 
} 

変数argsの読み込みをいつ停止するかを判断できる必要があります。これは、ターミネータ引数(私の例では-1)を使って、あるいは他のソースから期待されるargsの数を知ることによって行われます(たとえば、printfのように書式設定文字列を調べるなど)。

6

すべての仮引数が同じ型である場合、バリディックマクロを使用する代わりに配列を渡すこともできます。 C99の複合リテラルといくつかのマクロ魔法で

、これは非常に素晴らしく見ることができます:何の

#include <stdio.h> 

#define sum(...) \ 
    sum_(sizeof ((int []){ __VA_ARGS__ })/sizeof (int), (int []){ __VA_ARGS__ }) 

int sum_(size_t count, int values[]) 
{ 
    int s = 0; 
    while(count--) s += values[count]; 
    return s; 
} 

int main(void) 
{ 
    printf("%i", sum(1, 2, 3)); 
} 
+1

+1これは最善のアプローチです、私はそれを頻繁に使用します。しかし空の引数リストを指定すると失敗します。回避するには、引数の数を計算するために以下の構文を使用してください: "sizeof((int []){0、## __ VA_ARGS __})/ sizeof(int)-1"空リストの場合##__ VA_ARGS__は前のコンマを食べます。 – qrdl

+0

これについて詳しく説明できますか?私に抽象的だと思われる:) – nubela

+0

@nubela:http://stackoverflow.com/questions/1385695/help-me-understand-this-short-chunk-of-code/1386555#1386555 – Christoph