如果宏中的语句不起作用

时间:2017-01-06 06:29:16

标签: c++ c macros

我对宏中的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传递给宏时,编译器会发出警告,我可以消除警告吗?

谢谢!

1 个答案:

答案 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)){ \