Cracking C++(4):头文件不能使用using namespace std吗?

这篇具有很好参考价值的文章主要介绍了Cracking C++(4):头文件不能使用using namespace std吗?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 目的

初学者容易直接写 using namespace std, 对于 hello world 的 demo 工程来说完全 OK, 但是容易带着这种习惯,在工程的 .h/.hpp 文件中也这样用。

于是, 会被一些“高手”告诫: 别在头文件里使用 using namespace, 否则将会引入大量潜在的命名冲突。

然而这个说法也不准确。

2. 显式声明

using namespace std

改为

using std::cin;
using std::cout;

优点: 只引入了需要的。
缺点: 需要多打几个字母。

3. 在头文件的函数定义里使用 using namespace xxx

关于能否在头文件中定义函数, 是另一个话题了, 简单的结论是: 对于模板函数,通常是放在头文件里; 如果打算做一个 header-only 的库, 主要目的也许是快速开发, 那也是ok的。于是可以像下面这样写:

template <typename FloatType> inline
FloatType compute_something(FloatType x)
{
    using namespace std; // No problem since scope is limited
    return exp(x) * (sin(x) - cos(x * 2) + sin(x * 3) - cos(x * 4));
}

优点: std 只影响当前函数, 换言之范围被限定了, 不会传播到包含当前头文件的文件中的全局范围。

4. ADL:函数参数使用完整名字,调用函数时候可以不写 namespace

这算是一个相关话题了。

ADL 是 Argument-dependent name lookup 的缩写,看个例子就明白了:

namespace NS {

class A {};

void f(A& a, int i) {}

}  // namespace NS

int main() {
   NS::A a;
   f(a, 0);  // Calls NS::f.
}

由于参数 a 在定义时是 NS::A 类型, 因此在调用 f(a, 0) 时, 参数 a 所属的命名空间 NS 被作为候选命名空间的一个元素,用于查找 f 函数。 进而匹配到了 NS::f.

5. 结论

在 C++ 的头文件中, 如果是全局作用域里, 请不要使用 using namespace std.

但在 C++ 的头文件中, 在一个函数内部, 甚至一个 namespace 内部, 可以使用 using namespace std.

以上结论适合替换为 using namespace 你的ns, 以及 using std::cout 等形式的单个引入。文章来源地址https://www.toymoban.com/news/detail-475061.html

5. References

  • https://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice
  • https://en.wikipedia.org/wiki/Argument-dependent_name_lookup

到了这里,关于Cracking C++(4):头文件不能使用using namespace std吗?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Cracking C++(1): 头文件包含

    准备开一个新的系列, cracking c++。是看 https://hackingcpp.com/ 这个网站的相关学习记录。 本文是第一篇,是学习C++中 #include 的用法。这里假定读者知道可以用 -I 参数来告诉 g++/clang++ 搜索路径。 C++ 的 hello world 程序如下: 本文只考虑第一行代码 #include iostream 的理解。 #include 是

    2024年02月08日
    浏览(11)
  • C++中using namespacr std;的作用

    在 C++ 中,using namespace std; 是一个常用的语句,它的作用是引入 std 命名空间中的所有成员到当前的命名空间中,这样在当前的作用域中就可以直接使用 std 命名空间中的所有成员,而不需要在每个标识符前加上 std:: 的前缀。 例如,在没有 using namespace std; 的情况下,要使用

    2024年02月16日
    浏览(9)
  • c++命名空间和include C++ #include<string> 和 using std::string

    1、C++中的命名空间namespace_51CTO博客_c++中的命名空间   2、 C++ #includestring 和 using std::string_yang20141109的博客-CSDN博客 //不光要加头文件,和C语言不同 #include utils/Errors.h //还要加using using android::status_t; using android::INVALID_OPERATION; using android::NO_ERROR; using android::BAD_VALUE; 3、c和c++的差

    2023年04月20日
    浏览(13)
  • c++命名空间和include C++ #include<string> 和 using std::string

    1、C++中的命名空间namespace_51CTO博客_c++中的命名空间   2、 C++ #includestring 和 using std::string_yang20141109的博客-CSDN博客 //不光要加头文件,和C语言不同 #include utils/Errors.h //还要加using using android::status_t; using android::INVALID_OPERATION; using android::NO_ERROR; using android::BAD_VALUE; 3、c和c++的差

    2023年04月20日
    浏览(15)
  • C++头文件和std命名空间

    C++头文件和std命名空间

    C++ 是在C语言的基础上开发的,早期的 C++ 还不完善,不支持命名空间,没有自己的编译器,而是将 C++ 代码翻译成C代码,再通过C编译器完成编译。 这个时候的 C++ 仍然在使用C语言的库,stdio.h、stdlib.h、string.h 等头文件依然有效;此外 C++ 也开发了一些新的库,增加了自己的

    2024年02月11日
    浏览(23)
  • 【C++技能树】NameSpace --命名空间的使用

    【C++技能树】NameSpace --命名空间的使用

      Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接       我会一直往里填充内容哒! 🌈LeetCode专栏:专栏链接       目前在刷初级算法的LeetBook 。若每日一题当中有力所能

    2023年04月16日
    浏览(13)
  • make 报错:’XX‘ is not a member of ‘std‘或者 ’XX‘ in namespace ‘std‘ does not name a template type 报错解决方法

    Gazebo仿真时遇到的问题, 可能情况之一是std标准库版本太低, 可以通过在CmakeLists.txt中添加语句解决: set(CMAKE_CXX_FLAGS \\\"${CMAKE_CXX_FLAGS} -std=c++17\\\") (根据自己实际情况修改,现在std的版本貌似已经到23了)

    2024年01月16日
    浏览(12)
  • java import、package与php的namespace和use、requie实质

    首先,java的工作原理是,首先去java的环境变量classpath或者你当前编译目录下去找有没有你需要的类 import、package 后跟着的其实不是文件的真实路径,事实上,它们不需要按照名称组织文件夹,你把他们统统放在一个目录下也可以正常编译运行。将其按照文件路径组织仅仅是

    2024年02月11日
    浏览(12)
  • 【c++】std::move 所有权转移的使用

    【c++】std::move 所有权转移的使用

    1. std::move 用法详细梳理 使用std::move函数的好处是可以将资源的所有权从一个对象转移到另一个对象,而不需要进行深拷贝操作。对于智能指针类型的变量,使用std::move也是可以的,并且不会产生冲突。 当使用std::move(ref_frames)时,会将ref_frames的所有权转移到ref_frames_,这样做

    2024年02月15日
    浏览(10)
  • C++三剑客之std::any(一) : 使用详解

    C++三剑客之std::any(一) : 使用详解

    相关系列文章 C++三剑客之std::optional(一) : 使用详解 C++三剑客之std::any(一) : 使用详解 C++之std::tuple(一) : 使用精讲(全) C++三剑客之std::variant(一) : 使用 C++三剑客之std::variant(二):深入剖析 目录 1.概述 2.构建方式 2.1.构造函数 2.2.std::make_any 2.3.operator=分配新值 3.访问值std::any_cast

    2024年02月21日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包