我有以下代码
#define LogError(...) fprintf(stderr, __VA_ARGS__)
我想要另一个宏只在调试模式下打印到错误日志,所以我期望,与
#define DebugLogError(...)
#ifndef NDEBUG
fprintf(stderr, __VA_ARGS__);
#endif
DebugLogError("hello %s", "world")
代码展开到
#ifndef NDEBUG
fprintf(stderr, "hello %s", "world")
#endif
但是代码没有编译。如何实现这一点?
C标准不提供在宏中使用预处理器指令的特性。而不是尝试在宏中使用#if
,使用#if
来控制如何定义宏:
#if defined NDEBUG
// If NDBUG is defined, define the macro to be replaced by nothing.
#define DebugLogError(...)
#else
// Otherwise, define the macro to print a debugging message.
#define DebugLogError(...) fprintf(stderr, __VA_ARGS__);
#endif
但是,通常最好修改宏,这样它就可以像一个函数调用后面跟着一个;
一样使用,从而更顺利地适应C语法:
#if defined NDEBUG
// If NDBUG is defined, define the macro to be replaced by nothing.
#define DebugLogError(...)
do { } while (0)
#else
// Otherwise, define the macro to print a debugging message.
#define DebugLogError(...)
do fprintf(stderr, __VA_ARGS__); while (0)
#endif
以后一种形式定义它们将避免错误,因为额外的分号(在no-NDEBUG
的情况下)或缺少代码(在NDEBUG
的情况下)会导致问题,如:
if (SomeCondition)
DebugLogError(stuff);
else
OtherCode;