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

Can I include a headerfile in a namespace?

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

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

namespace some_namespace
{
    #include <conio.h>
}

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

这是有效的语法吗?我知道 <conio.h> 仅适用于 windows,但这种语法在所有编译器中的行为是否相同?您还建议使用哪些其他方法来解决此问题?

编辑:

我在 Windows 上使用 GCC 和 MSVC 2019,它在两者上编译都很好。

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

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

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

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

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