如何解决我可以在命名空间中包含头文件吗?
我正在使用 <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
).
解决方法
像 <conio.h>
这样的系统头文件打算在 C 和 C++ 中使用,将它们的声明包含在 extern C
范围内,强制 C 链接包含在其中的所有内容,无论是什么您添加的其他 C++ 命名空间。这就是您的代码在这种情况下编译的原因。
另见this,它几乎与此问题重复,但不完全相同。
简而言之,是的,它是有效的,但我强烈反对它。有许多其他方法可以解决这个问题,例如为您想要为其提供替代符号的函数创建包装模块。
附带说明:尝试将您自己的 getch
放在 extern C
块中。我猜你会收到链接器错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。