在C中,定义类似printf的宏的正确方法是什么,只有在定义了DEBUG符号时才会打印?
#ifdef DEBUG
#define DEBUG_PRINT(???) ???
#else
#define DEBUG_PRINT(???) ???
#endif
Run Code Online (Sandbox Code Playgroud)
哪里??? 是我不知道该填写什么的地方
Aid*_*lly 39
我已经看到了这个成语:
#ifdef DEBUG
# define DEBUG_PRINT(x) printf x
#else
# define DEBUG_PRINT(x) do {} while (0)
#endif
Run Code Online (Sandbox Code Playgroud)
使用它像:
DEBUG_PRINT(("var1: %d; var2: %d; str: %s\n", var1, var2, str));
Run Code Online (Sandbox Code Playgroud)
额外的括号是必要的,因为一些较旧的C编译器不支持宏中的var-args.
moo*_*dow 22
#ifdef DEBUG
#define DEBUG_PRINT(...) do{ fprintf( stderr, __VA_ARGS__ ); } while( false )
#else
#define DEBUG_PRINT(...) do{ } while ( false )
#endif
Run Code Online (Sandbox Code Playgroud)
mip*_*adi 17
就像是:
#ifdef DEBUG
#define DEBUG_PRINT(fmt, args...) fprintf(stderr, fmt, ## args)
#else
#define DEBUG_PRINT(fmt, args...) /* Don't do anything in release builds */
#endif
Run Code Online (Sandbox Code Playgroud)
Tom*_*hel 15
谢谢mipadi,我也用文件信息改进了你的DEBUG_PRINT.
#define DEBUG 3
#if defined(DEBUG) && DEBUG > 0
#define DEBUG_PRINT(fmt, args...) fprintf(stderr, "DEBUG: %s:%d:%s(): " fmt, \
__FILE__, __LINE__, __func__, ##args)
#else
#define DEBUG_PRINT(fmt, args...) /* Don't do anything in release builds */
#endif
Run Code Online (Sandbox Code Playgroud)
用最新的铿锵声测试,例如
int main(int argc, char **args) {
DEBUG_PRINT("Debugging is enabled.\n");
DEBUG_PRINT("Debug level: %d", (int) DEBUG);
}
Run Code Online (Sandbox Code Playgroud)
输出:
DEBUG: debug.c:13:main(): Debugging is enabled.
DEBUG: debug.c:14:main(): Debug level: 3
Run Code Online (Sandbox Code Playgroud)
小智 5
使用不同的 DEBUG_PRINT 签名,它们不必相同,例如:
#ifdef DEBUG
#define DEBUG_PRINT printf
#else
#define DEBUG_PRINT(...)
#endif
Run Code Online (Sandbox Code Playgroud)
这样,在调试模式下,DEBUG_PRINT 调用将被 printf 替换。发布时它将忽略之前使用的所有参数。
希望能帮助到你。