MinGW 搞砸了 COLORREF 和 RGB

Posted

技术标签:

【中文标题】MinGW 搞砸了 COLORREF 和 RGB【英文标题】:MinGW screw up with COLORREF and RGB 【发布时间】:2013-06-27 07:19:14 【问题描述】:

我正在尝试使用 MinGW 构建第 3 方开源项目。依赖项之一是 wxWidgets。当我尝试从 MSYS 制作项目时,我收到了来自

的编译器错误

/MinGW/msys/1.0/local/include/wx-2.8/wx/msw/private.h

In function 'COLORREF wxColourToRGB(const wxColour&)':
error: cannot convert 'RGB' to 'COLORREF aka long unsigned int' in return

这有点奇怪,因为according to Microsoft RGB 宏返回 COLORREF

事实上,在 H:\MinGW\include 中我找到了带有以下代码的wingdi.h

#define RGB(r,g,b) ((COLORREF)((BYTE)(r)|((BYTE)(g) << 8)|((BYTE)(b) << 16)))

什么样的事情会导致这个错误?有什么方法可以检查 COLORREF 和 RGB 是否包含在wingdi.h 而不是其他地方?这还值得检查吗?

规格

GCC 版本 4.7.2 wxWidgets 版本 2.8.12

(我特别是 C++ 和 MinGW 的新手,但通常具有计算机和编程知识)

【问题讨论】:

你使用的是什么编译器版本? 我使用的 MinGW 版本附带 GCC 4.7.2。我已将此信息添加到原始帖子中。 有人从 int 吞下了 t。 已修复。我无法从 msys shell 复制,或者至少我不知道如何复制。 【参考方案1】:

尝试使用 -E 对源代码进行预处理,并检查宏扩展实际发生的情况或是否有某些东西正在重新定义宏。

#includeing 其标头依赖项之后,预处理的源代码无疑会非常冗长。您的文本编辑器的搜索功能,grepfindstr 是您的朋友。

【讨论】:

我这样做了,可以看到 RGB 没有被扩展。这一定意味着有什么东西弄乱了它...... @kjoppy 在预处理源代码中,您还应该看到有关头文件名和行号的注释提示。你在哪里看到wingdi.h 吗?您可以转到假定定义了 RGB 的那一行,然后查看它的去向。后来有没有其他东西取消了它,或者可能是 ifdef 守卫把它删掉了? 这是一个很好的建议。我发现假定的 RGB 宏没有被扩展。然后我终于发现它在项目的一个标题中被#undefed,因为原作者想要一个 3 字节结构的名称。我刚刚在项目源代码中的所有位置将RGB 重命名为RGB3,删除了#undef RGB 行,一切都很正常。 @kjoppy 这就是为什么宏是邪恶的 ;) 这听起来像是那种我根本不会欣赏的声明,直到为时已晚......

以上是关于MinGW 搞砸了 COLORREF 和 RGB的主要内容,如果未能解决你的问题,请参考以下文章

python PIL png文本搞砸了

为啥大括号缩进在 Visual Studio 2015 中搞砸了?

当我结合 UIPanGestureRecognizer 和自动布局时,我的 UIViews 搞砸了

c++ 指针对向量搞砸了

浮动在 Safari 浏览器中搞砸了

gprof 搞砸了