0

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

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

namespace some_namespace
{
    #include <conio.h>
}

然后我可以some_namespace::getch在我想访问其中的功能<conio.h>以及getch我想访问自己的功能时使用。

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

编辑:

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

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

4

1 回答 1

1

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

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

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

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

于 2021-05-08T16:31:30.870 回答