【问题标题】:How to check if a variable or function exists in std?(in c++)如何检查std中是否存在变量或函数?(在c ++中)
【发布时间】:2016-02-11 21:35:01
【问题描述】:

我在我的代码中使用了 std(using namespace std)(我知道这不太好,应该避免使用)然后我想知道哪些名称可用于变量或函数,哪些已经被占用,所以我搜索了 std 变量和函数的列表,但没有找到。

PS。我的代码实际上是一个作业,所以没有扩展梦想,也因为它是一个作业我应该使用std(:|)(即使我不是我只是好奇答案)。所以我的问题是std 现在中存在的变量和函数是什么。

【问题讨论】:

  • 在 std 命名空间中拥有标准内容的全部意义在于,您不必担心它。如果你不做 use namespace std; 这样的蠢事,你就不必担心。
  • 你误以为你应该这样做。
  • @SergeyA 不不,我向你保证这不是一个错误,即使它是我只是好奇。
  • 语言说明:您是否假设您拥有using namespace std 以便访问std 的成员?你知道std:: 前缀吗?你知道using std::namehere; 语法吗,例如using std::cout? ideone.com/e3Axtt——这里的人不是要你停止使用std,而是要你停止写using namespace std
  • @kfsone 是的,我知道。 ;)

标签: c++ c++11


【解决方案1】:

std 中没有明确的名称列表 - 它始终可以扩展,并且正是为此目的而创建的。因此,一劳永逸地停止 using 命名空间。

换句话说,C++ 标准规定了必须 的名称,但绝不会将整体名称限制为规定的名称。实现通常会将许多其他辅助函数或类放入此命名空间。

【讨论】:

  • 我的代码实际上是一个作业,所以没有扩展的梦想,也因为它是一个作业,我有点期望使用 std ( :| )。所以我的问题是现在 std 中存在的变量和函数是什么。
  • 实现可以将非标准库名称放在std中是真的吗(除了以___开头的那些?)
  • @Bat,不,你不应该这样做。
  • @juanchopanza,我想是的。我从未见过任何会禁止他们这样做的事情。另一方面,我不是一名优秀的语言律师。
  • @gen,有一个很棒的 SO 问题,这是您在谷歌上搜索这些词时返回的第一个链接。
【解决方案2】:

正如其他人建议的那样,停止using namespace std - 这是不好的做法。

我还建议您停止 using 任何命名空间。这样,您的代码可读性更好,您可以避免隐藏事物和名称冲突,最重要的是,您始终负责您的代码库:您知道您使用的东西来自哪里以及它们更广泛的范围/用途可能是什么。这可以使您的代码更易于维护:例如,更容易查看未使用的标头。什么样的功能只是辅助/内部等。

这主要是一个口味问题,但我进一步建议您自己使用名称空间或详细的描述性名称(至少对于那些范围不是很短的对象)。所有当代 IDE 都提供自动完成功能,因此您甚至不必多次输入。在我的代码中,我使用了以下内容:

bool has_the_loader_finished;
bool should_the_program_quit;
void helper::setup::setup_animation();

一直都是。这样一来。我的代码中真的不需要很多 cmets,大多数事情都是不言自明的,所以我只为特殊的事情保留 cmets,b.我确信不会有名称冲突和 c.我不必花时间尝试调试/重构我不再记得诸如

之类的东西的代码
int i;
bool flag;
void setup();

代表..

当然也有using很直观的情况,比如:

using std::placeholders
ExampleFunction f = std::bind(&Object::hello, &instance,_1); // instead of std::placeholders::_1

using namespace std::chrono_literals;
auto halfmin = 30s; //instead of std::chrono_literals::30s

using ms = std::chrono::milliseconds; // this is an alias basically

然而,好的做法是始终 a。限制使用您计划使用的特定事物,例如:using std::placeholders 而不是 using std b.使用别名或 typedef 和 c。 尽可能限制using(和类型定义/别名)的范围 例如:

int someFunction() {
  using namespace std;
  // no more than a 20-30 lines of code here
}

// someSmallFile.cpp
using namespace std; // this is valid in the body of this file only

最后,切勿在头文件中使用using namespace。这会将这个命名空间的内部结构暴露给包含该文件的所有翻译单元,并且您的客户不一定知道它......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 2012-07-05
    • 2011-08-18
    • 1970-01-01
    相关资源
    最近更新 更多