我们有一个函数宏#define FOO(arg) foo(arg)用int foo(const char* bar);.当定义NDEBUG时,FOO被定义为#define FOO(arg) 0,但是这会导致许多编译器警告,因为在许多情况下不使用FOO的返回值.该解决方案应与ANSI C编译器一起使用,并且不会发出警告.我试过了:
(void)0:不能分配给变量
static int foo(const char* bar) { return 0; } :在某些模块中导致未使用的静态功能警告
static inline int foo(const char* bar) { return 0; } :仅适用于C99编译器
谢谢你的帮助!
edit1:它有点像跟踪宏,并在整个项目中使用.它主要用作声明FOO("function x called");,但在我看到的一些情况下if (FOO("condition a")) { /* some more debug output */ }.在NDEBUG定义和优化的情况下,FOO不应该留下任何东西.我没有拿出这个,但我必须清理这个烂摊子:).
edit2:我应该补充一点,对于gcc release build,使用了这些标志:-O3 -Wall -ansi
edit3:现在我要去__inline int dummy() { return 0; }.__inline在ansi模式下与VisualC和GCC一起使用.
您可以采取以下措施来防止出现警告:
#ifndef NDEBUG
#define FOO(arg) foo(arg)
#else
#define FOO(arg) abs(0)
#endif
Run Code Online (Sandbox Code Playgroud)
stdlib.h我并不是说这是理想的(例如,您必须确保包含在各处),但它确实可以防止出现警告。