Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 宏记录错误并返回false_C++_Syntax Highlighting - Fatal编程技术网

C++ 宏记录错误并返回false

C++ 宏记录错误并返回false,c++,syntax-highlighting,C++,Syntax Highlighting,我处理的项目中的大多数语句都是 if(!someObject->someFunction(arg1,arg2)) { cerr << "Something bad happened. Args are: " << arg1.print() << " " << arg2 << endl; return false; } if(!someObject->someFunction(arg1,arg2)) { CURR

我处理的项目中的大多数语句都是

if(!someObject->someFunction(arg1,arg2))
{
    cerr << "Something bad happened. Args are: " << arg1.print() << " " << arg2  << endl;
    return false;
}
if(!someObject->someFunction(arg1,arg2))
{

CURR

代码不是C++标准的一致性和不可移植性。

({..})
是名为的gcc编译器扩展

如果您使用
-pedantic
标志编译代码,它会告诉您代码不符合标准


除非您不担心源代码跨不同编译器的可移植性,否则您应该避免使用任何不被C++标准支持的代码构造,而只是编译器扩展。

< P>我认为最好是一个函数:

bool fnAssert(bool cond, char * strCond, char *msg, char *file, int line)
{
    if (!cond)
    {
        cerr << "@File: " << file << ":" << line << " " << strCond << " failed."
              << msg << endl;
    }
    return cond;
}

#define Assert(cond, a) fnAssert(cond, #cond, a, __FILE__, __LINE__)
现在当你写一个陈述时:

ReturnOnAssert(isItBad, "Something bad happened", retVal);

如果
isItBad
为false,您将从函数返回值为
retVal


<强> >隐藏<代码>返回<代码>宏是一个大的不不imo。不要这样做。你想保存什么,在<代码> 2行代码>如果< /Cord>?/P> > P>当你想要一个更好的C++处理错误的方法时,你应该看看TCPL特别版的附录E。最好避免宏MA。gic,如果可以的话。附录讨论了处理错误时要使用的技术。这也可从以下网址获得:

编辑:对于使用逗号的宏魔术案例…这可能是一种可能的方式:

 #define ReturnFalse(error,a1,a2) \
 ({ \
  cerr << error << "@File: " << __FILE__ << "Line: " << __LINE__ << #a1<<" "<<#a2 <<endl; \
  return false; \
  false; \
 })
#定义ReturnFalse(错误,a1,a2)\
({ \

CURR构造是GCC扩展,不是标准C++。<代码>({ })< /C> >,我指。为什么HAV <代码> false <代码>后面跟着“代码>返回false < /Cord>”?如何保存一些类型和混乱的函数:BooL失败(字符串错误){cerr@Aditya,
operator | |
要求在右侧有一个
bool
,而
return
语句是
void
@stijn,这不会打印行号。当您说“使用逗号运算符”时你是指逗号运算符,还是只想向宏传递额外的参数?函数/宏的逗号分隔参数不是逗号运算符,只是一点语法。看起来不错,但考虑是否能够以标准方式使用逗号运算符。@balki:为什么?你越是巧妙地制作这个宏,就越有可能实际上,它是有一些边缘的情况下,它失败得可怕。KISS@balki-您可以使用
运算符,
,但为什么?结果将完全相同,只是更难阅读和理解。宏将隐藏在某些标题中。使用的语句是否看起来更干净?使用fn,我将无法打印参数/state.@Dennis.是的,但如果我一次做对了,我会避免大量代码重复,可能还有bug。@balki:这并不能避免代码重复?等等,你的意思是想把附加参数作为参数传递给宏吗?这根本不是逗号运算符。
#define ReturnOnAssert(cond, a, b) if (! Assert(cond,a) ) return b;
ReturnOnAssert(isItBad, "Something bad happened", retVal);
DoWhatever(), ReturnOnAssert(isItBad, "Something bad happenedAgain", retVal);
 #define ReturnFalse(error,a1,a2) \
 ({ \
  cerr << error << "@File: " << __FILE__ << "Line: " << __LINE__ << #a1<<" "<<#a2 <<endl; \
  return false; \
  false; \
 })