在C中,定义类似printf的宏的正确方法是什么,只有在定义了DEBUG符号时才会打印?
#ifdef DEBUG
#define DEBUG_PRINT(???) ???
#else
#define DEBUG_PRINT(???) ???
#endif
在哪里???是我不知道该填写什么的地方
答案 0 :(得分:36)
我已经看到了这个成语很多:
#ifdef DEBUG
# define DEBUG_PRINT(x) printf x
#else
# define DEBUG_PRINT(x) do {} while (0)
#endif
使用它像:
DEBUG_PRINT(("var1: %d; var2: %d; str: %s\n", var1, var2, str));
额外的括号是必要的,因为一些较旧的C编译器不支持宏中的var-args。
答案 1 :(得分:20)
#ifdef DEBUG
#define DEBUG_PRINT(...) do{ fprintf( stderr, __VA_ARGS__ ); } while( false )
#else
#define DEBUG_PRINT(...) do{ } while ( false )
#endif
答案 2 :(得分: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
答案 3 :(得分:14)
谢谢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
使用最新的clang测试,例如
int main(int argc, char **args) {
DEBUG_PRINT("Debugging is enabled.\n");
DEBUG_PRINT("Debug level: %d", (int) DEBUG);
}
输出:
DEBUG: debug.c:13:main(): Debugging is enabled.
DEBUG: debug.c:14:main(): Debug level: 3
答案 4 :(得分:2)
您可以简单地使用:
#ifdef DEBUG
#define DEBUG_PRINT printf
#else
#define DEBUG_PRINT
#endif
答案 5 :(得分:2)
使用DEBUG_PRINT的不同签名,它们不必相同,如:
#ifdef DEBUG
#define DEBUG_PRINT printf
#else
#define DEBUG_PRINT(...)
#endif
这样在调试模式下,DEBUG_PRINT调用将替换为printf。在发布时,它将忽略之前使用的所有参数。
希望它有所帮助。
答案 6 :(得分:0)
我最喜欢这种方式,因为它不会在发布版本中添加任何asm指令。
#define DEBUG
#ifdef DEBUG
#define debug_printf(fmt, ...) printf(fmt, __VA_ARGS__);
#else
#define debug_printf(fmt, ...) /* Do nothing */
#endif
答案 7 :(得分:0)
我在 this implementation 中看到了一些小错误。所以,这是我的方法:
#ifdef DEBUG
#define DEBUG_PRINTF(...) printf("DEBUG: "__VA_ARGS__)
#else
#define DEBUG_PRINTF(...) do {} while (0)
#endif
示例用法:
DEBUG_PRINTF("hello\n");
然后,如果我在 C 构建选项中使用 -DDEBUG
定义来构建和运行,如下所示:
# Build
gcc -Wall -Wextra -Werror -std=c11 -DDEBUG -o build/my_program \
my_program_tests.c my_program.c
# Run
build/my_program
然后我看到这个输出:
<块引用>DEBUG: hello
但是如果我在编译器 C 选项中没有定义 -DDEBUG
的情况下构建,那么我看不到任何调试打印。