是否可以将标准的纯 C 标头 #include 指令放入命名空间中? [复制]

2024-01-19

可能的重复:
将 #include 包装在命名空间块中是个好主意吗? https://stackoverflow.com/questions/6670738/is-it-a-good-idea-to-wrap-an-include-in-a-namespace-block

我有一个带有课程的项目log在全局命名空间中(::log).

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

因此存在三种可能的解决方案,每种都有其独特的丑陋副作用。

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

Replace

#include <cmath>

by

namespace math {
#include "math.h"
}

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

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

  • (显然)不可能使用<cmath>,因为<cmath>代码通过函数的完全限定名称来访问函数,并且不推荐在 C++ 中使用它。
  • 我有一种非常非常不好的预感会被猛禽袭击并活活吃掉。 http://xkcd.com/292/

所以我的问题是:

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

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

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

edit

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


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

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

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

翻译单元应仅在任何外部声明或定义[*]之外包含标头,并且应在该翻译单元中对该标头中声明的任何实体的第一次引用之前按词法包含该标头。

[*] 其中将包括名称空间定义。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以将标准的纯 C 标头 #include 指令放入命名空间中? [复制] 的相关文章

随机推荐

  • 为什么这个 Lucene 查询是“contains”而不是“startsWith”?

    string q m Query query new QueryParser company new StandardAnalyzer Parse q 将导致查询成为 prefixQuery company a 尽管如此 我仍然会得到像 非
  • 如何向带有边框的 JPanel 添加填充

    我想添加填充到一些JPanels 我找到了这个答案 https stackoverflow com a 5328475 1590323 https stackoverflow com a 5328475 1590323 它对于没有边框的面板
  • Android 浏览器下载管理器

    我可以使用 Android 内置浏览器下载管理器来下载应用程序中的文件吗 对于音频文件 使用数据类型为 audio 的 Intent ACTION VIEW 打开远程文件 url 会导致浏览器开始播放 但我想强制下载指定文件 下载管理器不是
  • 区别:android:background 和 android:src? [复制]

    这个问题在这里已经有答案了 可能的重复 ImageView的src和background有什么区别 https stackoverflow com questions 5454491 what is the difference betwe
  • 如何在多部分http post请求中发布图像数组

    我想上传一组图像 我应该如何附加array to NSMutableData 这是我的代码 func createBodyWithParametersMulti parameters String String filePathKey St
  • 如何在WebSphere 8.5上安装Jenkins

    我正在尝试安装 jenkins 1 627 如上所述wiki https wiki jenkins ci org display JENKINS IBM WebSphere 虽然我收到了这个错误 无法加载 web 应用程序 SRVE8111
  • 我们需要用 c++11 重新编译库吗?

    这是一个非常无知的问题 但是 我想开始使用 C 11 我可以继续使用使用旧的 gcc 4 2 1 编译器编译的大量库 还是需要使用新编译器重新编译它们 我认为 或希望 答案是否定的 但我只是一个涉足者 这样我至少可以消除部分无知 你能解释一
  • Url 编码 # (%23) 导致 ASP.NET 应用程序中出现 404

    我有一个深层链接的 Silverlight RIA 试图使用 Twitter OAuth 回调 RIA 中回调 页面 的 URL 为 http example com RiaTestPage aspx callback 只要 符号经过 UR
  • IE9是否支持console.log,它是一个真正的功能吗?

    在什么情况下是window console log在 Internet Explorer 9 中定义 即使当window console log被定义为 window console log apply and window console
  • 在 Angular JS (1.x) 中验证分页表单

    我有一个使用带输入字段的表格的角度形式 用户可以添加和删除行 每个单元格的输入类型可以是文本 数字 日期等 如果表格太大 表格就会变慢 解决此问题的一种方法是对表进行分页 不幸的是 对表格进行分页是一个问题 因为我对输入字段进行了自定义验证
  • lfe 包裹去了哪里?我怎样才能找到类似的信息?

    我正在寻找这个的更新版本 https cran r project org web packages lfe index html https cran r project org web packages lfe index html包裹
  • 链接器命令失败,sdl

    我正在尝试编译我的第一个 SDL 程序 但它无法编译 顺便说一句 我猜这不应该是关于设置库 因为我认为我正确安装了库 这是我的命令 g main cpp o main I Library Frameworks SDL2 framework
  • 如何使用 gganimate 动画让 x 轴跨度移动?

    使用 R 我尝试使用 gganimate 制作一个基于 x 轴从左到右显示的折线图 我已经设法做到了这一点 但我还想做的是使scale x continuous limits c i 5 i 5 即在正在显示的点和窗口周围有一个窗口将继续前
  • 成员访问不完整类型“QScrollBar”[重复]

    这个问题在这里已经有答案了 QScrollArea scrollArea new QScrollArea this scrollArea gt verticalScrollBar gt width 我试图获取 QScrollArea 的 V
  • 如何在 OncreateView 中运行异步功能?

    我的应用程序有问题 首先 我使用以下命令制作了两个选项卡碎片这会膨胀一个activity 实现的选项卡工作正常 其次我已经展示了XAML right 但是 我现在需要异步运行一些东西 Fragment 中的 OnCreateView 我怎样
  • 万物皆对象是如何运作的?

    我了解背后的主要理论一切都是对象但我真的不明白它是如何在幕后实现的 功能 So foo 4 是相同的foo call 4 但是什么阻止了我做foo call call 4 foo是一个函数并且foo call 都是围绕函数的方法包装器 但是
  • 复制带有下一个和随机指针的链表,仅赋予链表读取权限

    我需要复制带有下一个和随机指针的链表 下 一个指针照常指向链表中的下一个元素 随机指针可能指向任何其他节点 甚至指向其自身 如果我不允许在任何时候修改给定的列表 而只给出列表的读取权限 该怎么办 优雅的解决方案 线性时间 恒定空间 创建节点
  • Microsoft Exchange 不会将 PHPmailer 生成的电子邮件呈现为 HTML

    这个问题已经困扰我好几个星期了 我有一个脚本 可以在 PHPmailer 的帮助下将带有 xls 附件的 html 电子邮件发送给多个收件人 它已经运行良好一年多了 最近 来自同一家公司的两个使用 Microsoft Exchange 作为
  • 如何设置svn仓库的权限?

    我在网络驱动器上创建了一个存储库svnadmin create repos 有没有办法设置用户对存储库的权限 如果是这种情况 如何设置这些权限 如果您需要通过以下方式管理访问svn 协议 嵌入授权 您所需要做的就是更改文件conf新创建的存
  • 是否可以将标准的纯 C 标头 #include 指令放入命名空间中? [复制]

    这个问题在这里已经有答案了 可能的重复 将 include 包装在命名空间块中是个好主意吗 https stackoverflow com questions 6670738 is it a good idea to wrap an inc