問題の一つは、可変引数の数が不明なため、引数の処理方法が曖昧になることです。この場合、可変引数の処理にはC言語の標準ライブラリであるstdarg.h
を使用する方法があります。stdarg.h
では、va_list
、va_start
、va_arg
、va_end
などの関数やマクロを使用して可変引数を処理します。以下に例を示します。
#include <stdio.h>
#include <stdarg.h>
void printNumbers(int count, ...)
{
va_list args;
va_start(args, count);
for (int i = 0; i < count; i++) {
int num = va_arg(args, int);
printf("%d ", num);
}
va_end(args);
}
int main()
{
printNumbers(3, 10, 20, 30);
return 0;
}
上記のコードでは、printNumbers
関数が可変引数を受け取り、それらの引数を順番に出力します。va_list
型の変数args
を宣言し、va_start
マクロで可変引数の処理を開始します。ループ内でva_arg
マクロを使用して可変引数を取得し、printf
関数で出力します。最後に、va_end
マクロで可変引数の処理を終了します。
また、可変引数を処理するための別の方法として、マクロの再帰展開を使用する方法もあります。以下に例を示します。
#include <stdio.h>
#define PRINT_ARGUMENT(arg) printf("%d ", arg)
#define PRINT_ARGUMENTS(...) EXPAND_ARGS(PRINT_ARGUMENT, __VA_ARGS__)
#define EXPAND_ARGS(macro, ...) APPLY_FOR_EACH_ARG(macro, __VA_ARGS__)
#define APPLY_FOR_EACH_ARG(macro, arg, ...) macro(arg) REPEAT_FOR_EACH_ARG(macro, __VA_ARGS__)
#define REPEAT_FOR_EACH_ARG(macro, arg, ...) macro(arg) APPLY_FOR_EACH_ARG(macro, __VA_ARGS__)
int main()
{
PRINT_ARGUMENTS(10, 20, 30);
return 0;
}
上記のコードでは、PRINT_ARGUMENT
というマクロが可変引数を受け取り、printf
関数で出力します。PRINT_ARGUMENTS
マクロは、EXPAND_ARGS
マクロを呼び出して可変引数を展開し、各引数に対してPRINT_ARGUMENT
マクロを適用します。EXPAND_ARGS
マクロは再帰的に展開を行うため、可変引数の数に制限はありません。