答えて
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のように書式設定文字列を調べるなど)。
va_arg
and friendsをご覧ください。
可変アライメント機能を実装しようとしている場合は、http://www.cprogramming.com/tutorial/lesson17.htmlをご覧ください。
すべての仮引数が同じ型である場合、バリディックマクロを使用する代わりに配列を渡すこともできます。 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これは最善のアプローチです、私はそれを頻繁に使用します。しかし空の引数リストを指定すると失敗します。回避するには、引数の数を計算するために以下の構文を使用してください: "sizeof((int []){0、## __ VA_ARGS __})/ sizeof(int)-1"空リストの場合##__ VA_ARGS__は前のコンマを食べます。 – qrdl
これについて詳しく説明できますか?私に抽象的だと思われる:) – nubela
@nubela:http://stackoverflow.com/questions/1385695/help-me-understand-this-short-chunk-of-code/1386555#1386555 – Christoph
- 1. 可変アリティを持つ戦術
- 2. アリティが
- 3. 明示的なマッチの場合を超えて、可変アリティを持つClojureパターンマッチングマクロ
- 4. 演算子のアリティは何ですか?
- 5. Cの可変プロモーション
- 6. C++可変マルチタイプは可能ですか?
- 7. C#IEnumeratorは変更不可
- 8. Haskellで任意のアリティ関数を定義する方法は、0のアリティを含んでいますか?
- 9. 関数のアリティを取得する
- 10. Cの列の可変長
- 11. C++の可変スコープのメカニック
- 12. C++ 11可変テンプレートテンプレートパラメータ
- 13. C++可変関数
- 14. C++可変引数の数は
- 15. C++可変長マクロまたは可変長テンプレート?
- 16. Cでの可変置換
- 17. Cの可変宣言コンセプト
- 18. スコープ、C#での可変アクセス
- 19. Objective-Cの可変スコープ
- 20. C++可変可視スコープとストリム
- 21. C++クラス変換は可能ですか?
- 22. C++可変引数関数の可変引数マクロ
- 23. 可変長テンプレート内のC++特殊化可変長テンプレート
- 24. 可変長配列C++ラッパーコンテナ
- 25. 可変埋め込みC
- 26. C++可変型条件式
- 27. C++可変マルチペア配列
- 28. Objective-Cブロックと可変スコープ
- 29. C++可変デクレーション構文
- 30. C++変更可能なミューテックス
変数アリティを?機能? –
もっと具体的なものをお探しください。サンプルコード(コンパイルする必要はなく、達成しようとしていることを実証するだけで、それを見たいと思う方法は非常に便利です)。 –
パリティ、おそらく?どんな状況で?もっとお聞かせください。 – dmckee