我可以在命名空间中包含头文件吗?
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
块中。我猜你会遇到链接器错误。
我正在使用 <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
块中。我猜你会遇到链接器错误。