我无法在命名空间范围内使用全局名称声明函数(gcc)

3
我正在尝试在我的“wnd”命名空间中声明自己的“CreateWindow”,但gcc会提示“错误:宏”CreateWindowA“需要11个参数,但只提供了1个|”。请告诉我如何正确获取它。 以下是代码:
#include <windows.h>

namespace wnd
{


void CreateWindow()
{
}

}

3
听起来那个恶意的头文件将名称定义为宏。你唯一能做的就是选择另一个名称,或者不包含那个头文件。除非你有支持Windows的原因,否则我建议选择后者。 - Mike Seymour
@NathanOliver:不,它不这样。 - Lightness Races in Orbit
我需要这个头文件用于一些函数(如CreateWindowEx等)。我会使用其他名称。谢谢大家。 - graveman
@LightningRacisinObrit 抱歉,实际上应该在winuser.h中,但你应该包含windows.h https://msdn.microsoft.com/en-us/library/windows/desktop/ms632679%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396 - NathanOliver
1
@NathanOliver:不,它不是一个函数(滚动到页面底部!不过其余部分确实非常误导)。这就是问题所在。 - Lightness Races in Orbit
显示剩余4条评论
2个回答

4

在Windows API中,名称CreateWindow已经存在。不幸的是,您的命名空间(尝试得不错!)没有效果,因为原始符号是一个

只要包括windows.h,就没有好的解决方法。您将不得不为函数选择不同的名称。


1

有一个名为CreateWindow的宏与您的函数名称冲突。

最好的做法是只是更改您的函数名称

如果您坚持可以使用#undef CreateWindow,但这会导致每个包含您文件的文件都取消该宏,这是有问题的。

所以您需要堆叠并将其带回:

#pragma push_macro("CreateWindow")
#undef CreateWindow

void CreateWindow()
{
}

#pragma pop_macro("CreateWindow")

*它仍然只在pragma范围内可见。

1
好的,这是个好主意。但是你还需要在每个调用点都这样做。看起来不是正确的方法。 - Lightness Races in Orbit
Arnon Zilca,谢谢!似乎只有使用函数才能通过这个技巧,而宏则不行。 - graveman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接