【问题标题】:Can I include a headerfile in a namespace?我可以在命名空间中包含头文件吗?
【发布时间】:2021-05-08 15:14:06
【问题描述】:

我正在使用<conio.h> 头文件,在我的源代码的其他地方我定义了一个名为getch 的函数,它必须具有该名称。由于<conio.h> 中已经有一个getch,并且这个头文件在全局命名空间中声明了它的所有函数,所以我遇到了名称冲突。

我发现使用以下语法可以避免冲突:

namespace some_namespace
{
    #include <conio.h>
}

然后我可以在我想访问&lt;conio.h&gt;中的函数时使用some_namespace::getch,当我想访问我自己的函数时使用getch

这是有效的语法吗?我知道&lt;conio.h&gt; 仅适用于 Windows,但这种语法在所有编译器中的行为是否相同?你有什么其他方法可以解决这个问题?

编辑:

我在 Windows 上使用 GCC 和 MSVC 2019,它们都可以正常编译。

我也可以访问&lt;conio.h&gt; 中的函数,尤其是上面显示的getch(即使我应该在MSVC 中使用名称_getch 而不是getch)。

【问题讨论】:

  • 为什么不把你自己的代码(包括你的getch)放在你自己的命名空间中?
  • 别忘了extern "C"&lt;conio.h&gt;是一个C头文件。
  • @S.M.我在 gcc 和 MSVC 2019 上都试过了,它们都适用。
  • 你应该把你的 getch() 放在你的命名空间中。
  • 编写标准头文件的目的是为了在全局命名空间中使用它们。如果这种hackery 碰巧起作用,那只是偶然,并且很可能因使用不同的编译器(包括您现在使用的编译器的未来版本)而失败。

标签: c++ namespaces header-files conio


【解决方案1】:

&lt;conio.h&gt; 这样打算在C 和C++ 中使用的系统头文件会将它们的声明包含在extern C 范围内,强制C 链接其中包含的所有内容,而不管您使用任何其他C++ 命名空间添加。这就是你的代码在这种情况下编译的原因。

另见this,这几乎是这个问题的重复,但不完全是。

简而言之,是的,它是有效的,但我强烈反对它。还有许多其他方法可以解决此问题,例如为您希望为其使用替代符号的函数创建包装模块。

附带说明:尝试将您自己的getch 放入extern C 块中。我猜你会得到一个链接器错误。

【讨论】:

    猜你喜欢
    • 2012-04-03
    • 2010-11-15
    • 2011-07-14
    • 2016-05-23
    • 2015-05-28
    • 2011-07-24
    • 2013-10-30
    • 1970-01-01
    • 2021-09-01
    相关资源
    最近更新 更多