c宏中的宏.怎么做

  • 本文关键字: c macros c-preprocessor
  • 更新时间 :
  • 英文 :


我有以下代码

#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;

相关内容

  • 没有找到相关文章

最新更新