C++ 奇怪的模式:所有函数/方法在C++;
在我最近的两个项目中,我看到了一条奇怪的准则,“所有方法/函数都应该使用一些常见的错误代码类型返回错误代码”。在这两个项目中,错误代码都是int-typedef 在C++中有什么好的理由吗?一些MISRA要求或类似的东西 我只看到缺点:C++ 奇怪的模式:所有函数/方法在C++;,c++,c,coding-style,C++,C,Coding Style,在我最近的两个项目中,我看到了一条奇怪的准则,“所有方法/函数都应该使用一些常见的错误代码类型返回错误代码”。在这两个项目中,错误代码都是int-typedef 在C++中有什么好的理由吗?一些MISRA要求或类似的东西 我只看到缺点: 如果函数应该返回一个值,则通过参数引用完成。e、 g: 字符串s; 错误\代码err=getString 功能的重要性并不明显。一切看起来都一样。错误列表包含数百个错误,从低级错误到某些特定于域的错误 您是否体验过这种编程风格?有好的论据来反对它还是支持它?
- 如果函数应该返回一个值,则通过参数引用完成。e、 g: 字符串s; 错误\代码err=getString
- 功能的重要性并不明显。一切看起来都一样。错误列表包含数百个错误,从低级错误到某些特定于域的错误
这听起来不是一个好主意,但也不是一个坏主意。对于团队来说,就返回错误的通用方法达成一致并不罕见,因为这有助于创建项目代码的通用“外观”,就像其他团队范围的编码约定一样。这可以帮助新的团队成员更快地了解整体情况,并使团队中其他人的代码的维护更加直观 < >我惊讶的是,C++项目是在错误后面而不是在异常之外统一起来的。这里讨论了使用异常与错误代码的利弊
我想支持错误代码处理的一个理由是,如果您使用的是C风格的API,它会引导您采用这种方法(cough…Win32…cough)。我认为这是一种非常糟糕的风格,原因有几个
int
和一些通用错误类如果使用C++,最好的方法可能是使用异常…
< p>这个习惯很常见,尤其是在C世界。 尽管我自己不使用它,而且我认为它弊大于利(在其他答案中更多地说明了这一点),但我确实发现了它的一个优点:一种向呼叫站点报告意外错误的一致方法。类似于errno变量,但更易于使用例如,考虑一组函数:
int a();
std::string b();
double c();
std::list<long> d();
但这也会用一个额外的参数污染每个函数
不幸的是,在C语言中,如果您真的需要设计这样一个API来指示不同类型的故障,那么就没有太多的可能性以一种好的方式来实现。但是,在C++世界中,你可以使用异常。< P>我已经看到了这样的论点:当链接到由另一个编译器编译的C++库,而不是用来编译二进制文件时,异常可能不起作用。虽然这种不起作用的说法可能完全正确,但实际上,即使是链接过程也不需要起作用(尽管每个人都可能遵守标准),因此,理论上,这种说法是无效的。然而,在实践中,可能(对不起,我在这里没有经验),名称冲突很少出现,对齐冲突很少出现,而且,除了例外,所有其他特定于实现的内容都得到了广泛的认可 我看到的第二个论点是运行时性能。虽然异常情况下的堆栈展开代价很高,但我还没有看到一个公平的基准,将异常与实际的返回代码检查量进行比较
在我的典型C++中,我使用混合。我使用较慢的异常处理我确实不希望经常发生的东西,或者测量为很少执行的代码路径,但返回更可能中断和可能频繁调用的东西的代码。
在紧循环中抛出异常,因为某些有趣的条件在每次迭代中都成立,这并不便宜(假设循环体可以处理它)。看看(Windows)NT。所有系统调用和大多数其他函数都返回NTSTATUS值。很好,谢谢!在这两个项目中,不应使用例外情况:-(我猜这也是统一错误代码规则的原因-从来没有返回一个无效的值,通常您会用异常来表示。我认为这种方法不是最适合C++的,在这里您可以使用某种类型的类,并返回无效的值(例如通过提供BoOL ISVALUTE()CONST;用一个类型的“魔法”值来表示失败是ihmo非常糟糕的风格。在Windows上,COM保证名称损坏和对齐
int x(bool* ok);