我对宏中的if语句感到困惑。 这是我的代码:
#ifdef SHOW_LOGS_
#define LOG(operation, parameter, value) \
do { \
if ((parameter) == (NULL)){ \
fprintf(stderr,"%s:%d: %s\n",__FILE__,__LINE__,operation);\
}else { \
fprintf(stderr,"%s:%d: %s, [%s] : %d\n",__FILE__,__LINE__,operation,parameter,value);\
} \
} while(0)
#else
#define LOG
#endif
但是,当我测试我的代码时:
LOG("ROUNDING UP...",NULL,NULL);
编译器给了我一个警告,它告诉我上面的测试代码转向执行
fprintf(stderr,"%s:%d: %s\n",__FILE__,__LINE__,operation);
不是正确的。所以if语句不起作用。
这是另一个例子:
#define TEST_EQ_BASE(equality,expect,actual,format) \
do { \
test_count++; \
if (equality){ \
test_pass++;\
}else{ \
main_ret = 1; \
fprintf(stderr,"%s:%d: expect: " format " actual: " format "\n",__FILE__,__LINE__,expect,actual);\
} \
}while (0)
在此代码中,if语句有效。
我很困惑,为什么会有区别?
谢谢!
修改
对不起你们,我是一名大三学生,不太熟悉这个宏,很抱歉。
我检查了结果,if语句确实有效,但编译器仍抱怨:
uninitialized.h:88:2: note: in expansion of macro ‘LOG’
LOG("__uninitialized_copy_aux: copying without constructor...",NULL,NULL);
^
stl_config.h:53:87: warning: format ‘%d’ expects argument of type ‘int’, but argument 7 has type ‘long int’ [-Wformat=]
fprintf(stderr,"%s:%d: %s, [%s] : %d\n",__FILE__,__LINE__,operation,parameter,value);\
这是输出:
uninitialized.h:88: __uninitialized_copy_aux: copying without constructor...
这是扩展的宏:
do { if ((__null) == (__null))
{ fprintf(stderr,"%s:%d: %s, [%s] : %d\n","uninitialized.h",80,"__uninitialized_copy_aux: copying with constructor...",__null,__null); }else
{ fprintf(stderr,"%s:%d: %s\n","uninitialized.h",80,"__uninitialized_copy_aux: copying with constructor..."); } } while(0);
所以我认为问题是当将NULL传递给宏时,编译器会发出警告,我可以消除警告吗?
谢谢!
答案 0 :(得分:2)
请再次查看您的代码。
#define LOG(operation, parameter, value) \
do { \
if ((parameter) == (NULL)){ \
fprintf(stderr,"%s:%d: %s, [%s] : %d\n",__FILE__,__LINE__,operation,parameter,value);\
}else { \
fprintf(stderr,"%s:%d: %s\n",__FILE__,__LINE__,operation);\
} \
} while(0)
如果fprintf
,您真的要parameter
(parameter) == (NULL)
吗?
尝试更改此行
if ((parameter) == (NULL)){ \
到
if ((parameter)){ \