在现有代码中添加如下一个宏,竟然出错,
#define error_return(f) /
do { /
if (!(f)) /
{ /
std::cout<<"error happened when calling "<<#f<<std::endl; /
return; /
} /
} while (0)
编译通不过,并且提示一些乱七八糟的错误。添加宏error_return之前,
代码没有问题,所以肯定是这个宏有问题。设置预处理器生成预处理文件,
重新编译,在生成的预处理文件中,在原先定义宏的行上有如下语句
if (!(f)) /
{ /
std::cout<<"error happened when calling "<<#f<<std::endl; /
return; /
} /
} while (0)
这些语句是宏体内容,却没有被预处理器去掉,这说明,这些代码没有被当作宏体来处理,问题应该出在这里了。
郁闷了半天,把光标移动到do所在行,发现/之后还有空格,而且,恰巧宏体内的代码就是在这儿分开的。
不知道是不是因为/之后有空格的原因,就将这些空格去除,其它行的也去除掉,再次编译,结果正常了。
真是个怪问题,以前从来就没有遇上过。为了验证是不是只有VS2005会出现这种情况,我将代码拿到
Linux和AIX上编译,发现在g++上能够通过编译,但是会有如下警告提示
test.cpp:7:6: warning: backslash and newline separated by space
在AIX上编译没有问题,也没有提示信息。
看来这是一个依赖于编译器的问题,估计是微软的编译器都存在这个问题。
无奈,这样的问题都让我遇上了,很是郁闷了半天。