使用 isalpha 函数时不需要 std 命名空间
No need for std namespace when using isalpha function
我是C++的初学者。据我了解,为了使用名称,我们必须包含由该名称组成的库。此后,我们可以在命名空间前面加上名称或使用 using 关键字。
例如
不使用关键字:
std::cout << "Hello Word!" << std::endl;
使用关键字:
using namespace std;
cout << "Hello World!" << endl;
我在网上看到一个工作代码示例,该示例使用 std
命名空间中 locale
库中的isalpha
名称。但是,该示例不使用上述任何方法。
例如
#include <iostream>
#include <locale>
int main() {
std::cout << isalpha('a') << std::endl;
}
有人可以向我解释为什么代码仍然有效吗?
当您包含 C 库工具的 C++ 标头(即对应于 C 标头<foo.h>
的标头<cfoo>
)时,C 库中的名称将在命名空间std
中声明。但是,此外,未指定名称是否也在全局命名空间中声明。
在您的情况下,他们似乎是。但你不能依赖它,你也不应该依赖它。
有两个正确的变体,如下所示:
-
// C++ header #include <cctype> int main() { return !std::isalpha('a'); }
-
// C header #include <ctype.h> int main() { return !isalpha('a'); }
允许编译器声明超出标准指定名称的额外名称,但如果代码依赖于实现的此类工件,则代码不可移植。
始终为您使用的函数包含正确的标头,您将避免意外。
相关文章:
- 我可以在"std"命名空间中添加推理指南吗?
- 哪些C结构出现在std命名空间中
- 为什么在这种特殊情况下不需要将 std::hash() 的专用化注入到 std 命名空间中?
- 即使在包含 std 命名空间之后,fstream 在 Visual Studio 2017 中也无法正常工作
- 从 std 命名空间中专门化函数模板的想法有多糟糕?
- 范围运算符需要查找 std 命名空间而不是提升
- C++ 什么时候可以扩展"std"命名空间?
- 如何跳过调试 Visual C++ 2013 中的所有 std 命名空间
- C++余弦在没有 std 命名空间的情况下工作 - 为什么
- 为什么我的日志在 std 命名空间中
- ctime std::命名空间冲突
- 为什么某些函数<cmath>不在 std 命名空间中?
- 在单步执行 std::function 调用时,如何跳过 std 命名空间中的方法调用?(使用 GDB
- 使用 std 命名空间,为什么(或为什么不)我应该在 std:: 前面加上前缀
- isnan 是否在 std:: 命名空间中?更一般地说,何时是 std::必要、可选或要避免
- 在std命名空间中添加模板专用化
- Eclipse CDT插件无法识别某些文件中的std命名空间
- Xcode 找不到'std'命名空间
- 在查找期间在std命名空间中拖动外部命名空间
- 为什么 setjmp 在包含 时不在 std 命名空间中?<csetjmp>