Allow debug prints without __VA_ARGS__

__VA_ARGS__ are frustrating in C. Even for their main purpose (printf),
they fall short in that they don't have a _portable_ way to have zero
arguments after the format string in a printf call.

Even if we detect compilers and use ##__VA_ARGS__ where available, GCC
emits a warning with -pedantic that is _impossible_ to explicitly
disable.

This commit contains the best solution we can think of. A bit of
indirection that adds a hidden "%s" % "" to the end of the format
string. This solution does not work everywhere as it has a runtime
cost, but it is hopefully ok for debug statements.
This commit is contained in:
John Hemmick
2019-11-05 14:43:02 -06:00
committed by Christopher Haster
parent 6b65737715
commit 6372f515fe

View File

@@ -50,31 +50,35 @@ extern "C"
// Logging functions // Logging functions
#ifdef LFS_YES_TRACE #ifdef LFS_YES_TRACE
#define LFS_TRACE(fmt, ...) \ #define LFS_TRACE_(fmt, ...) \
printf("lfs_trace:%d: " fmt "\n", __LINE__, __VA_ARGS__) printf("lfs_trace:%d: " fmt "%s\n", __LINE__, __VA_ARGS__)
#define LFS_TRACE(...) LFS_TRACE_(__VA_ARGS__, "")
#else #else
#define LFS_TRACE(fmt, ...) #define LFS_TRACE(...)
#endif #endif
#ifndef LFS_NO_DEBUG #ifndef LFS_NO_DEBUG
#define LFS_DEBUG(fmt, ...) \ #define LFS_DEBUG_(fmt, ...) \
printf("lfs_debug:%d: " fmt "\n", __LINE__, __VA_ARGS__) printf("lfs_debug:%d: " fmt "%s\n", __LINE__, __VA_ARGS__)
#define LFS_DEBUG(...) LFS_DEBUG_(__VA_ARGS__, "")
#else #else
#define LFS_DEBUG(fmt, ...) #define LFS_DEBUG(...)
#endif #endif
#ifndef LFS_NO_WARN #ifndef LFS_NO_WARN
#define LFS_WARN(fmt, ...) \ #define LFS_WARN_(fmt, ...) \
printf("lfs_warn:%d: " fmt "\n", __LINE__, __VA_ARGS__) printf("lfs_warn:%d: " fmt "%s\n", __LINE__, __VA_ARGS__)
#define LFS_WARN(...) LFS_WARN_(__VA_ARGS__, "")
#else #else
#define LFS_WARN(fmt, ...) #define LFS_WARN(...)
#endif #endif
#ifndef LFS_NO_ERROR #ifndef LFS_NO_ERROR
#define LFS_ERROR(fmt, ...) \ #define LFS_ERROR_(fmt, ...) \
printf("lfs_error:%d: " fmt "\n", __LINE__, __VA_ARGS__) printf("lfs_error:%d: " fmt "%s\n", __LINE__, __VA_ARGS__)
#define LFS_ERROR(...) LFS_ERROR_(__VA_ARGS__, "")
#else #else
#define LFS_ERROR(fmt, ...) #define LFS_ERROR(...)
#endif #endif
// Runtime assertions // Runtime assertions