【问题标题】:including windows.h causes clashing with local variable name包括 windows.h 会导致与局部变量名发生冲突
【发布时间】:2011-07-13 12:26:02
【问题描述】:

我将windows.h 包含在我的一个h 文件中(为了使用CaptureStackBackTrace),在Visual-Studio 项目中。起初,由于在windows.h 中使用了最小/最大标准方法和同名宏,我遇到了一些编译器错误,但这似乎可以通过#define NOMINMAX 解决,正如我在其他 SO 帖子中所读到的那样。 (我说“似乎”是因为在我的整个项目再次构建好之前我无法确定)。

问题是一些局部变量名现在破坏了构建。行:

int grp1;

在类方法中,会导致以下错误:

error C2143: syntax error : missing ';' before 'constant'

如果我将变量名更改为grp1_,cpp 文件编译正常。

当然我可以只更改变量名,但是我感觉我做错了什么——是吗?或者这是包含windows.h 时的已知问题?除了更改变量名之外,还有其他更优雅的解决方案吗?

【问题讨论】:

    标签: c++ windows visual-studio


    【解决方案1】:

    dlg.h 包含该行

    #define grp1        0x0430
    

    您可以通过定义 WIN32_LEAN_AND_MEAN 来排除它。

    【讨论】:

    • 如果它在您计划分发的标头中,最好避免命名冲突,以防用户需要dlgs.h。否则,您应该将WIN32_LEAN_AND_MEAN 添加到您的所有项目中!节省了一些编译时间,并摆脱了一些烦人的事情。
    【解决方案2】:

    在某种程度上,这是所有库标题的问题。 C 和 C++ 保留以 _ 开头的名称用于(标准库的)实现。其他库是独立的。人们希望namespace,或者如果库必须在 C 中可编译,则需要某种命名约定,例如前缀,但 Windows 和 Posix 都没有这样做。 (在早期,X 的标头包含#define String,这导致其他库的问题无穷无尽。)

    最终,没有任何好的解决方案。你只需要等到你被它击中,然后更改你的函数的名称。 (windows.h 尤其糟糕,因为其中的大部分“函数”实际上都是宏,不服从作用域。)

    【讨论】:

      【解决方案3】:

      嗯,grp1 在 dlgs.h 中是这样定义的:

      #define grp1        0x0430
      

      dlgs.h 包含在 windows.h 中,因此发生冲突。

      你可以在#include <windows.h> 之后#undef grp1。不是最漂亮的网站,但如果您只包含一次 windows.h,您可以将这些修复程序保留在一个地方。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-25
        相关资源
        最近更新 更多