【发布时间】:2014-06-21 16:17:42
【问题描述】:
我继承了一段(大)代码,该代码具有错误跟踪机制,其中它们将布尔变量传递给它们调用的所有方法,并且在执行的各个阶段出现错误时,该方法将停止并返回,有时是默认值价值。
类似(之前):
#include <iostream.h>
int fun1(int par1, bool& psuccess)
{
if(par1 == 42) return 43;
psuccess = false;
return -1;
}
int funtoo(int a, bool& psuccess)
{
int t = fun1(a, psuccess);
if(!psuccess)
{
return -1;
}
return 42;
}
void funthree(int b, bool& psuccess)
{
int h = funtoo(b, psuccess);
if(!psuccess)
{
return;
}
cout << "Yuppi" << b;
}
int main()
{
bool success = true;
funthree(43, success);
if(!success)
{
cout<< "Life, universe and everything have no meaning";
}
}
请注意,这是 C 和 C++ 代码的混合,正是项目的方式。
现在,C 魔术出现了:“某人”在某处定义了一个宏:
#define SUCCES_OR_RETURN if(!psuccess) return
上面的程序变成了(AFTER):
#include<iostream.h>
int fun1(int par1, bool& psuccess)
{
if(par1 == 42) return 43;
psuccess = false;
return -1;
}
int funtoo(int a, bool& psuccess)
{
int t = fun1(a, psuccess);
SUCCES_OR_RETURN -1;
return 42;
}
void funthree(int b, bool& psuccess)
{
int h = funtoo(b, psuccess);
SUCCES_OR_RETURN ;
std::cout << "Yuppi" << b;
}
int main()
{
bool success = true;
funthree(43, success);
if(!success)
{
cout<< "Life, universe and everything have no meaning";
}
}
问题:我想知道是否有更好的方法来处理这种错误跟踪,或者我必须忍受这种情况。我个人不喜欢滥用C 宏SUCCES_OR_RETURN 即。一旦用参数调用它,而在其他情况下不带参数调用它,感觉就像一个真正的return 声明,但我没有找到任何更好的解决这个古老设计的方法。
请注意,由于平台限制,我们有几个限制,但无论如何我都愿意听取关于这两个的意见:
- 抛出异常。该代码是相互调用的 C 和 C++ 函数的混合体,编译器不支持
throw(接受语法但不做任何事情,只是一个警告)。此解决方案是在 C++ 环境中解决此问题的标准方法。 - C++11 特性,这是一个微型嵌入式平台,它带有一个晦涩而古老的“几乎”C++ 编译器,它不是为支持最新的 C++ 特性而设计的。但是,如果有 C++11 提供的任何东西,我会很好奇以供将来参考。
- 模板魔法。编译器在理解复杂的模板问题时遇到了问题,但我还是愿意看到您能提出的任何解决方案。
编辑
另外,正如@BlueMoon 在推荐中所建议的那样,创建一个全局变量是行不通的,因为在函数链的最开始调用success 变量是一个类的成员变量,并且有几个对象类创建后,他们每个人都需要报告其成功状态:)
【问题讨论】:
-
“我没有找到任何更好的解决方案来解决这个古老的设计。” 也许我遗漏了什么,但为什么不直接使用编辑器的查找/替换功能进行与宏相同的替换?宏在这里的作用是什么?提高可读性?呸!
-
实际作用是降低可读性...
-
您已经通过说您的编译器不支持这些选项排除了您想听到的选项?此外,我不明白为什么有人想传递一个变量给每个函数来捕获成功。这不是我们有返回码的原因吗?如果必须这样做,则使用全局变量。如果该变量在所有地方传递,我不明白为什么全局不适合。那个宏是没有意义的。摆脱它!
-
代码更改越多,您就越成为它的所有者。扩展宏(@Cody Gray)看起来是一个很好的步骤。除此之外,将其全部重新制造或不理会。span>