我在C ++代码中有以下功能(仅作为示例)
Object& XYZ::getObject(InObj obj) {
try{
return obj.getObj();
}
DC_THROW_ERROR(ExceptionObj, "Object Not Found"); // Macro which throws an exception
}
当我编译上面的代码时,我得到警告(即控制到达非void函数的结束)..宏在编译之前被扩展。所以编译器知道如果它没有返回它抛出异常的东西。如果是这样,为什么编译器发出警告在我的项目中,这些类型的函数都很复杂。为了摆脱这些警告,我在宏之后写下了一行。
return *(static_cast<Object*>(0));
这是一种正确的修复方法吗?我知道它有点狡猾..我不能改变代码,因为我必须改变大约1000个功能。那么有人可以告诉我是否有更好的方法来解决它?
由于
答案 0 :(得分:3)
收听编译器。摆脱(迄今为止未公开的)宏。或者只是解决它,但最好摆脱它 - 你进入make-C ++ - 看起来像语言X的东西,这是不好的。
干杯&amp;第h。,
答案 1 :(得分:2)
假设问题中的代码是导致问题的代码的忠实表示,则宏DC_THROW_ERROR必须类似于
#define DC_THROW_ERROR(err) catch(...) {throw err;}
DC_THROW_ERROR("Object Not Found")
之后的那个分号导致
Object& XYZ::getObject(InObj obj) {
try {
return obj.getObj();
}
// This is the expansion of DC_THROW_ERROR("Object Not Found")
catch (...) {
throw ("Object Not Found");
}
; // This is the semicolon that follows DC_THROW_ERROR("Object Not Found")
}
这是一个无关的分号,而不是宏,它使得编译器在控件中达到非空函数的末尾。也就是说,因为C和C ++中的语句应该以分号结束,所以代码的人类作者在宏调用结束后添加分号是很自然的。
你真的需要一个宏吗?宏一般都是邪恶的。这个宏是邪恶的化身。
#define BEGIN {
是邪恶的。重命名语法的宏是双重的邪恶。总而言之,这个宏是2x2x2x2,或十六倍的邪恶。这就是这个恶魔代码。