【问题标题】:Disable math.h crap when working with cmath [duplicate]使用 cmath 时禁用 math.h crap [重复]
【发布时间】:2013-10-03 12:42:42
【问题描述】:

我之前遇到了一个问题,因为没有std:: 的函数被重载。而且诅咒仍然不时发生,因为我不使用using namespace std;

Removing using namespace std causes the program to get crap results

有没有办法禁用所有来自 c 的非标准函数,并且只能与命名空间 std 下的 c++ 函数一起使用(不必使用 using namespace std;)?

换句话说:如果我使用sin() 而不是std::sin(),我想得到一个错误,这样我就不会犯那个错误。的 c 我们的,不仅针对 sin,还针对与 math.h 冲突的每个函数。

【问题讨论】:

  • 如果您省略math.h 并使用sin 而不使用std::,您不会收到错误吗?
  • 为什么不在前面加上std::
  • @cnicutar:问题是<cmath> 和朋友可能(也可能不会)将部分或全部函数转储到全局命名空间中。链接问题中的“废话”来自意外调用::abs(int) 而不是std::abs(double)
  • @JesseGood:因为有时我们会犯错。这就是为什么问题是问如果我们犯了那个特定的错误,如何让它成为错误。
  • @TheQuantumPhysicist 同意这是一个非常现实的问题,昨天的 question 是由于没有使用 std 版本,而且按照 S) 标准,人们花了一段时间才弄清楚。跨度>

标签: c++ c namespaces math.h cmath


【解决方案1】:

不幸的是,没有办法做到这一点。规则是#include <math.h> 将所有名称放入全局命名空间,也允许将它们放入std::。类似地,#include <cmath> 将所有名称放入 std::,并且允许也将它们放入全局命名空间中。允许使用无关名称空间的原因很简单,纯粹的版本通常无法实现,除非对现有的库进行大手术,这些库甚至可能不受 C++ 编译器人员的控制。

【讨论】:

    【解决方案2】:

    将 math.h 中的所有函数声明收集到 namespace neveruse 中,然后说 using namespace neveruse。现在所有对不合格sin 的引用都将是模棱两可的。

    【讨论】:

    • 这会不会……像把标准库弄得一团糟?我怎么知道这是否不会影响其他地方的其他事情?
    • 您可以在自己的命名空间中声明任何函数。与任何事物都没有冲突。它可以影响东西的唯一方法是产生编译错误。
    猜你喜欢
    • 2013-03-17
    • 1970-01-01
    • 2023-03-04
    • 2011-09-27
    • 2016-12-31
    • 2016-08-30
    • 2014-11-21
    • 2010-11-29
    • 2020-04-17
    相关资源
    最近更新 更多