【发布时间】:2021-05-08 15:14:06
【问题描述】:
我正在使用<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(即使我应该在MSVC 中使用名称_getch 而不是getch)。
【问题讨论】:
-
为什么不把你自己的代码(包括你的
getch)放在你自己的命名空间中? -
别忘了
extern "C",<conio.h>是一个C头文件。 -
@S.M.我在 gcc 和 MSVC 2019 上都试过了,它们都适用。
-
你应该把你的 getch() 放在你的命名空间中。
-
编写标准头文件的目的是为了在全局命名空间中使用它们。如果这种hackery 碰巧起作用,那只是偶然,并且很可能因使用不同的编译器(包括您现在使用的编译器的未来版本)而失败。
标签: c++ namespaces header-files conio