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
对源代码进行预处理,并检查宏扩展实际发生的情况或是否有某些东西正在重新定义宏。
在#include
ing 其标头依赖项之后,预处理的源代码无疑会非常冗长。您的文本编辑器的搜索功能,grep
和 findstr
是您的朋友。
【讨论】:
我这样做了,可以看到 RGB 没有被扩展。这一定意味着有什么东西弄乱了它...... @kjoppy 在预处理源代码中,您还应该看到有关头文件名和行号的注释提示。你在哪里看到wingdi.h
吗?您可以转到假定定义了 RGB 的那一行,然后查看它的去向。后来有没有其他东西取消了它,或者可能是 ifdef
守卫把它删掉了?
这是一个很好的建议。我发现假定的 RGB 宏没有被扩展。然后我终于发现它在项目的一个标题中被#undefed,因为原作者想要一个 3 字节结构的名称。我刚刚在项目源代码中的所有位置将RGB
重命名为RGB3
,删除了#undef RGB
行,一切都很正常。
@kjoppy 这就是为什么宏是邪恶的 ;)
这听起来像是那种我根本不会欣赏的声明,直到为时已晚......以上是关于MinGW 搞砸了 COLORREF 和 RGB的主要内容,如果未能解决你的问题,请参考以下文章
为啥大括号缩进在 Visual Studio 2015 中搞砸了?