我可以在命名空间中包含头文件吗?

时间:2021-05-08 15:14:06

标签: c++ namespaces header-files conio

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

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

namespace some_namespace
{
    #include <conio.h>
}

然后当我想访问some_namespace::getch中的函数时可以使用<conio.h>,当我想访问我自己的函数时可以使用getch

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

编辑:

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

我也可以访问 <conio.h> 中的函数,特别是上面显示的 getch(即使我应该在 MSVC 中使用名称 _getch 而不是 getch ).

1 个答案:

答案 0 :(得分:1)

<conio.h> 这样的系统头文件打算在 C 和 C++ 中使用,将它们的声明包含在 extern C 范围内,强制 C 链接包含在其中的所有内容,无论是什么您添加的其他 C++ 命名空间。这就是您的代码在这种情况下编译的原因。

另见this,它几​​乎与此问题重复,但不完全相同。

简而言之,是的,它是有效的,但我强烈反对它。有许多其他方法可以解决这个问题,例如为您想要为其提供替代符号的函数创建包装模块。

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