gpt4 book ai didi

c++ - 可以将标准的纯 C header #include 指令放在命名空间中吗?

转载 作者:IT老高 更新时间:2023-10-28 21:39:33 25 4
gpt4 key购买 nike

Possible Duplicate:
Is it a good idea to wrap an #include in a namespace block?

我有一个类 log 的项目在全局命名空间 (::log) 中。

所以,很自然地,在 #include <cmath> 之后,每次我尝试实例化日志类的对象时,编译器都会给出一条错误消息,因为 <cmath>用许多三字母方法污染全局命名空间,其中之一是对数函数 log() .

所以有三种可能的解决方案,每一种都有其独特的丑陋副作用。

  • 将日志类移动到它自己的命名空间,并始终使用它的完全限定名称访问它。我真的想避免这种情况,因为记录器应该尽可能方便使用。
  • 写一个mathwrapper.cpp项目中唯一包含 <cmath> 的文件。 ,并使所有必需的<cmath>可通过 namespace math 中的包装器获得的功能.我不想使用这种方法,因为我必须为每个所需的数学函数编写一个包装器,并且它会增加额外的调用惩罚(由 -flto 编译器标志部分取消)
  • 我目前正在考虑的解决方案:

替换

#include <cmath>

通过

namespace math {
#include "math.h"
}

然后通过math::log()计算对数函数.

我已经尝试过了,它确实可以按预期编译、链接和运行。但是,它确实有多个缺点:

  • (显然)无法使用 <cmath> , 因为 <cmath>代码通过其完全限定名称访问函数,并且不推荐在 C++ 中使用。
  • 我有一种非常非常糟糕的感觉,就像我是 gonna get attacked and eaten alive by raptors.

所以我的问题是:

  • 是否有任何禁止将包含指令放入命名空间的建议/约定/等?
  • 有什么问题吗

    • 不同的 C 标准库实现(我使用 glibc),
    • 不同的编译器(我使用 g++ 4.7,-std=c++11),
    • 链接?
  • 你试过这样做吗?
  • 是否有其他方法可以从全局命名空间中消除数学函数?

我在 stackoverflow 上发现了几个类似的问题,但大多数都是关于包含其他 C++ 头文件,这显然是一个坏主意,而且那些没有对 C 库的链接行为做出矛盾的陈述。另外,另外放置 #include <math.h> 是否有益?里面 extern "C" {} ?

编辑

所以我决定做可能其他人都在做的事情,将我所有的代码放在一个项目命名空间中,并在包含 <cmath> 时使用它的完全限定名称访问记录器.

最佳答案

不,您正在考虑的解决方案是不允许的。实际上,这意味着您正在更改头文件的含义。您正在更改其所有声明以声明不同命名的函数。

这些更改的声明与标准库函数的实际名称不匹配,因此,在链接时,任何标准库函数都不会解析对更改声明声明的函数的调用,除非它们恰好已被声明 extern "C" 允许(但不推荐)用于来自 C 标准库的名称。

ISO/IEC 14882:2011 17.6.2.2/3 [using.headers] 适用于 C 标准库 header ,因为它们是 C++ 标准库的一部分:

A translation unit shall include a header only outside of any external declaration or definition[*], and shall include the header lexically before the first reference in that translation unit to any of the entities declared in that header.

[*] 将包含命名空间定义。

关于c++ - 可以将标准的纯 C header #include 指令放在命名空间中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12324302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com