在 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
使用#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