我有一个项目,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++ 中使用它。 - 我有一种非常非常糟糕的感觉,就像我会被猛禽攻击并活活吃掉一样。
所以我的问题是:
- 是否有任何建议/约定/等禁止在命名空间中放置包含指令?
有什么问题吗
- 不同的 C 标准库实现(我使用 glibc),
- 不同的编译器(我使用 g++ 4.7,-std=c++11),
- 链接?
- 你有没有试过这样做?
- 有没有其他方法可以从全局命名空间中消除数学函数?
我在 stackoverflow 上发现了几个类似的问题,但大多数都是关于包含其他 C++ 头文件,这显然是一个坏主意,而且那些没有对 C 库的链接行为做出矛盾陈述的问题。#include <math.h>
另外,另外放里面有好处extern "C" {}
吗?
编辑
所以我决定做可能其他人都在做的事情,并将我所有的代码放在项目命名空间中,并在包含<cmath>
.