10
GCCの## __ VA_ARGS__トリックの標準的な代替手段ですか?
C99の可変個引数マクロの空の引数に関するよく知られた 問題があります。 例: #define FOO(...) printf(__VA_ARGS__) #define BAR(fmt, ...) printf(fmt, __VA_ARGS__) FOO("this works fine"); BAR("this breaks!"); BAR()C99標準によれば、上記の使用は実際には正しくありません。 printf("this breaks!",); 末尾のコンマに注意してください-機能しません。 一部のコンパイラー(例:Visual Studio 2010)は、その末尾のコンマを静かに削除します。他のコンパイラ(例:GCC)##は__VA_ARGS__、の前に置くことをサポートしています。 #define BAR(fmt, ...) printf(fmt, ##__VA_ARGS__) しかし、この動作を実現するための標準準拠の方法はありますか?おそらく複数のマクロを使用していますか? 現在、##バージョンはかなりサポートされているようですが(少なくとも私のプラットフォームでは)、実際には標準に準拠したソリューションを使用します。 プリエンプティブ:小さな関数を書くことができることは知っています。マクロを使用してこれを実行しようとしています。 編集:BAR()を使用する理由の例(単純ですが)を次に示します。 #define BAR(fmt, ...) printf(fmt "\n", ##__VA_ARGS__) BAR("here is a log message"); BAR("here is a log message with a …