文字列化演算子を使用して、マクロに渡されたコンマを含む可能性のあるパラメーターを文字列に変換しています。私が知っているように、一部の文字は文字列化できません。特に、コンマ (,) はパラメーターを区切るために使用され、右括弧 ()) はパラメーターの終わりを示すために使用されます。そこで、可変長マクロを使用して、次のようにカンマを文字列化演算子に渡します。
#include <stdio.h>
#define TEST 10, 20
#define MAKE_STRING(...) #__VA_ARGS__
#define STRING(x) MAKE_STRING(x)
int main()
{
printf("%s\n", STRING(TEST) );
return 0;
}
それは正常に動作します。しかし、可変引数マクロがないとどうなるかが思い浮かんだので、マクロを変更します: #define MAKE_STRING(x) #x
. これは、Visual C++ 2008/2010 で予期せず正常にコンパイルされ、10, 20
gcc/clang が期待どおりにコンパイル エラーを出力している間に出力されます。
マクロ "MAKE_STRING" は 2 つの引数を渡しましたが、1 つしか取りません
だから私の質問: Visual c++ は追加の作業を行っていますか、それとも動作は未定義ですか?