【问题标题】:I can't declare function within namespace scope with global name (gcc)我无法使用全局名称 (gcc) 在命名空间范围内声明函数
【发布时间】:2015-04-13 12:29:46
【问题描述】:

我试图在我的“wnd”命名空间中声明我自己的“CreateWindow”,但 gcc 说“错误:宏“CreateWindowA”需要 11 个参数,但只有 1 个给定|”。 请告诉我如何正确获取它。 代码如下:

#include <windows.h>

namespace wnd
{


void CreateWindow()
{
}

}

【问题讨论】:

  • windows.h 中有一个CreateWindow() 函数。
  • 听起来像那个邪恶的标头将名称定义为宏。您唯一能做的就是选择另一个名称,或者不包括该标题。我推荐后者,除非您出于某种原因需要支持 Windows。
  • @NathanOliver:不,它没有
  • @NathanOliver 你的意思是,一个宏?
  • @NathanOliver:不,它不是一个函数(滚动到该页面的底部!诚然,它的其余部分极具误导性)。这就是问题所在。

标签: c++ gcc namespaces


【解决方案1】:

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

只要包含windows.h,就没有好的解决方法。您必须为您的函数选择一个不同的名称。

【讨论】:

    【解决方案2】:

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

    最好的办法就是更改您的函数名称

    如果你坚持你可以#undef CreateWindow,这是有问题的,因为它会为每个包含你的文件取消该宏。

    因此,您需要将其堆叠并带回:

    #pragma push_macro("CreateWindow")
    #undef CreateWindow
    
    void CreateWindow()
    {
    }
    
    #pragma pop_macro("CreateWindow")
    

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

    【讨论】:

    • 好的,好主意。但是,您也必须在每个呼叫站点都这样做。似乎是错误的方法。
    • 阿农·齐尔卡,谢谢!似乎它没有通过宏传递这个技巧,只有函数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 2012-12-18
    • 2012-05-03
    • 2017-05-31
    • 1970-01-01
    • 2013-08-16
    相关资源
    最近更新 更多