在C语言中,定义一个类似printf的宏的正确方法是什么,这个宏只有在定义了DEBUG符号时才打印?
#ifdef DEBUG #define DEBUG_PRINT(???) ??? #else #define DEBUG_PRINT(???) ??? #endif
where???是指我不确定要填写什么的地方
gojuced71#
我见过很多这样的成语:
#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。
7uzetpgm2#
#ifdef DEBUG #define DEBUG_PRINT(...) do{ fprintf( stderr, __VA_ARGS__ ); } while( false ) #else #define DEBUG_PRINT(...) do{ } while ( false ) #endif
jmo0nnb33#
比如:
#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
toe950274#
谢谢你的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
使用最新的金属声进行测试,例如
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
6fe3ivhb5#
使用不同的DEBUG_PRINT签名,它们不必相同,例如:
#ifdef DEBUG #define DEBUG_PRINT printf #else #define DEBUG_PRINT(...) #endif
这样在调试模式下,DEBUG_PRINT调用将被printf代替。2在释放时,它将忽略之前使用的所有参数。希望有帮助。
wnrlj8wa6#
您可以简单地用途:
#ifdef DEBUG #define DEBUG_PRINT printf #else #define DEBUG_PRINT #endif
llycmphe7#
我最喜欢这种方式,因为它不会向您的发布版本添加任何asm指令。
#define DEBUG #ifdef DEBUG #define debug_printf(fmt, ...) printf(fmt, __VA_ARGS__); #else #define debug_printf(fmt, ...) /* Do nothing */ #endif
uemypmqf8#
我在the implementation in the main answer中发现了一些小错误。因此,下面是我的方法:
#ifdef DEBUG #define DEBUG_PRINTF(...) printf("DEBUG: " __VA_ARGS__) #else #define DEBUG_PRINTF(...) do {} while (0) #endif
示例用法:
DEBUG_PRINTF("hello\n");
然后,如果我在C编译选项中使用-DDEBUG define on进行编译和运行,如下所示:
-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,那么我看不到任何调试打印。
1.使其也与C++兼容的修复方法:https://stackoverflow.com/a/72777133/4561887:在__VA_ARGS__前添加一个空格。使用"DEBUG: " __VA_ARGS__代替"DEBUG: "__VA_ARGS__!
__VA_ARGS__
"DEBUG: " __VA_ARGS__
"DEBUG: "__VA_ARGS__
8条答案
按热度按时间gojuced71#
我见过很多这样的成语:
像这样使用它:
额外的圆括号是必要的,因为一些较老的C编译器不支持宏中的var-args。
7uzetpgm2#
jmo0nnb33#
比如:
toe950274#
谢谢你的mipadi,我改进了你的DEBUG_PRINT文件信息了.
使用最新的金属声进行测试,例如
产出:
6fe3ivhb5#
使用不同的DEBUG_PRINT签名,它们不必相同,例如:
这样在调试模式下,DEBUG_PRINT调用将被printf代替。2在释放时,它将忽略之前使用的所有参数。
希望有帮助。
wnrlj8wa6#
您可以简单地用途:
llycmphe7#
我最喜欢这种方式,因为它不会向您的发布版本添加任何asm指令。
uemypmqf8#
我在the implementation in the main answer中发现了一些小错误。因此,下面是我的方法:
示例用法:
然后,如果我在C编译选项中使用
-DDEBUG
define on进行编译和运行,如下所示:然后我看到这个输出:
但是如果我在编译器C选项中没有定义
-DDEBUG
,那么我看不到任何调试打印。其他参考文献
1.使其也与C++兼容的修复方法:https://stackoverflow.com/a/72777133/4561887:在
__VA_ARGS__
前添加一个空格。使用"DEBUG: " __VA_ARGS__
代替"DEBUG: "__VA_ARGS__
!