#define DOLOG_BYNAME(_mod, _min) \
UNLIKELY(LOGLEVEL_BYNAME(_mod) >= (_min))
+#ifdef LOGLEVEL_VARIADIC
+/*
+ * Variadic macro wrinkle: C99 says "one or more arguments"; some compilers
+ * (gcc+clang+msvc) support zero arguments, but differ in tolerating a trailing
+ * comma. Solution: include format string in variadic arguments.
+ *
+ * C++2a introduces __VA_OPT__, which would allow this definition instead:
+ * define LOG_BYNAME(_mod, _min, _fmt, ...) \
+ * (DOLOG_BYNAME(_mod, _min) ? Log(_fmt __VA_OPT__(,) __VA_ARGS__) \
+ * : (void) 0)
+ * MSVC has always ignored a spurious trailing comma, so does not need this.
+ */
+#define LOG_BYNAME(_mod, _min, ...) \
+ (DOLOG_BYNAME(_mod, _min) ? Log(__VA_ARGS__) : (void) 0)
+
+#else
#define LOG_BYNAME(_mod, _min, _log) \
(DOLOG_BYNAME(_mod, _min) ? (Log _log) : (void) 0)
+#endif
/*
* Default
#ifdef VMX86_DEVEL
+ #ifdef LOGLEVEL_VARIADIC
+ #define LOG_DEVEL(...) Log(__VA_ARGS__)
+ #else
#define LOG_DEVEL(_x) (Log _x)
+ #endif
#else
#define LOG_DEVEL(...)
#endif