} while (0) 这里用到的是__VA_ARGS__宏,C99中被标准化,编译时自动替换为实际对应的参数集。 ##的作用是正确处理变长参数为空的情况。 题外话: 这里我们可以额外加入一个宏,使得vassert具有和assert一样的开关性质。 #ifdefNDEBUG#definevassert(expr, fmt, ...) ((void)0)#else