私はそのコードの下に与えられている私のアプリケーションでエラーメッセージを出力し、可変引数機能を持っている:可変引数関数をマクロに変換する方法は?
void error(char *format,...)
{ va_list args;
printf("Error: ");
va_start(args, format);
vfprintf(stderr, format, args);
va_end(args);
printf("\n");
abort();
}
次のようにこの関数は、エラー条件で使用されます。
error("invalid image width %d and image height %d in GIF file %s",wid,hei,name);
error()
関数であります異なる引数を持つ異なる場所から呼び出されます(可変引数関数)。
関数のアプローチがうまく機能します。
ここで、この関数をマクロに変換する必要がある場合はどうすればよいですか?私はそれをやってみました:
#define error(format) {va_list args;\
printf("Error: ");\
va_start(args, format);\
vfprintf(stderr, format, args);\
va_end(args);\
printf("\n"); abort()}
しかし、これは引数を正しく出力しません。
上記のマクロ定義で何が問題になっていますか?
修正プログラムとは何ですか。
@shawnchin:ありがとう。私はMSVC6.0、MSVS-2005コンパイラで試しましたが、可変引数マクロをサポートしていないようです。私はGCCがサポートしていると思いますが、これをサポートするコンパイラベースのコンパイラを知っていますか? – goldenmean
@goldenmean:このサイトでは、ISOスタイルのVariadicマクロがMSVS-2005 Visual C++(http://msdn.microsoft.com/en-us/library/ms177415(VS.80).aspx)で導入されたことを示しています –
@shawnchin:コンパイラがこの可変マクロをコンパイルできるようにするために設定する必要のある、特有のMSVisual Studioプロジェクトオプションはありますか?私はいくつかのオプションを設定しようとしました(例えば、C++のようにコードをコンパイルしてください)これらの可変マクロ拡張を受け入れるようにコンパイラを強制するマクロがありますか? – goldenmean