c中的重新定义错误

时间:2016-08-01 07:52:01

标签: c windows redefinition

我必须包含" windows.h"。问题是重新定义, 在windows.h中:

_gdi_entry WINGDIAPI BOOL  WINAPI Polygon(__in HDC hdc, __in_ecount(cpt)
                                            CONST POINT *apt, __in int cpt);

我的部分代码是(来自其他包含):

typedef struct Polygon
{
    U8 numElements;
    PolygonPoints element[15];    
}Polygon;

我无法更改代码中的定义。 我包括用于ShellExecute()的windows.h。 试过undef:

#ifdef Polygon 
#undef Polygon
#endif

没有帮助..

编辑:解决了罗德里戈的问题。

3 个答案:

答案 0 :(得分:4)

#undef Polygon赢了,因为Polygon()是一个真正的函数,而不是宏。在Windows中,该技巧主要适用于至少需要一个字符串参数的函数,因为Unicode与ANSI相关。

如果您只想要ShellExecute()函数,则可以在包含NOGDI之前定义Windows.h来省略所有GDI函数:

#define NOGDI
#include <windows.h>

或者,您可以将NOGDI宏添加到IDE的预处理器项目选项中。

答案 1 :(得分:1)

windows.hstruct Polygon的定义包含在两个不同的文件中。

包含windows.h的文件将定义一个函数,该函数接受字符串参数(和其他非结构Polygon参数)并调用ShellExecute。该功能已导出。

定义struct Polygon的文件不能包含windows.h,但可以将struct数据转换为字符串格式,并调用另一个文件中定义的导出函数。

答案 2 :(得分:0)

向名称空间冲突问好。首先,完全避免此类问题的最佳方法是为所有自己的标识符添加明确的前缀。例如,如果您的项目被称为&#34; foobar turboencabulator&#34;一个可行的前缀是Color。您应该无条件地执行此操作,因为您永远不会知道OS和/或运行时环境将来可能引入哪些标识符。 C语言标准规定了一些名称空间(标识符的保留前缀)以供将来扩展,但这适用于C而不是操作系统和运行时。

您已经获得了如何拆分编译单元的答案。但是在你的情况下还有另一种可能性,我强烈建议你考虑一下。您的struct / typedef定义是

fbtec…

你标记了你的问题typedef struct Polygon { U8 numElements; PolygonPoints element[15]; }Polygon; 所以我建议你接受这个事实:我建议你放弃C如果你写的只是

typedef

没有typedef,那么struct Polygon { U8 numElements; PolygonPoints element[15]; }; 将只存在于 结构标记命名空间中,这是一个与函数标识符所在的名称空间不同的名称空间。因此它将不再与Windows的Polygon功能。

这样做的缺点是,您必须更改所有变量和参数定义以引用struct命名空间,即Polygon变为Polygon a。 OTOH它在C中的惯用语是关于struct namespace的。