在 C 的宏函数中使用宏语句

Using macro statement in macro function in C

使用#ifdef <macro> <statement> #endif 允许仅在开发期间显示详细消息并且非常方便。我想知道是否有可能像下面的代码一样,变得更短:

// pseudo-code:

#define IN_DEV
#define DEBUG_ONLY(statement) (#ifdef IN_DEV (statement) #endif)

int main(void)
{
   DEBUG_ONLY(printf("hello from debug mode\n");)
   //...
}

这只会花费我一个非常易读的单行,可以打开或关闭。像这样/接近这样的可能吗?

那是不可能的。您不能在宏定义中使用 #if

你能做的是:

#define IN_DEV

#ifdef
 #define DEBUG_ONLY(statement) (statement)
#else
 #define DEBUG_ONLY(statement)
#endif

int main(void)
{
   DEBUG_ONLY(printf("hello from debug mode\n");)
   //...
}

这也可以只用一个宏来切换IN_DEV

您可以根据是否定义了 IN_DEV 来更改 DEBUG_ONLY 的含义:

// pseudo-code:

#ifdef IN_DEV
#define DEBUG_ONLY(statement) {statement}
#else
#define DEBUG_ONLY(statement) // Nothing
#endif

int main(void)
{
   DEBUG_ONLY(printf("hello from debug mode\n");)
   //...
}

运行 示例:Link

将整个表达式作为参数传递给宏没有多大意义。这既危险又难以维护。更糟糕的是,它让我们走上了“让我们发明自己的私有宏语言,而不是使用任何人都能理解的可读 C”的混淆之路。即使出于调试目的,这也是一个糟糕的主意。

更明智的方法是一个类似函数的打印宏,它只在调试版本中打印一些东西。

#ifdef INDEV
  #define DEBUG_PRINT(...) printf(__VA_ARGS__)
#else
  #define DEBUG_PRINT(...)
#endif

int main(void)
{
   DEBUG_PRINT("hello from debug mode\n");
}

可选地,这个宏可以缩小到只接受字符串并变得更安全(仅限 C17):

#ifdef INDEV
  #define DEBUG_PRINT(str) _Generic((str), char*: puts(str))
#else
  #define DEBUG_PRINT(str) _Generic((str), char*: (void)0)
#endif