2016-08-01 57 views
3

我必须包括 “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。 试过民主基金:

#ifdef Polygon 
#undef Polygon 
#endif 

没有帮助..

编辑:解决了罗德里戈的回答这个问题。

回答

4

#undef Polygon将不起作用,因为Polygon()是一个真正的功能,而不是一个宏。在Windows中,由于Unicode和ANSI的原因,该技巧主要适用于至少需要一个字符串参数的函数。

如果你只想要ShellExecute()功能,您可以通过包括Windows.h之前定义NOGDI忽略所有的GDI函数:

#define NOGDI 
#include <windows.h> 

另外,您可以在NOGDI宏添加到您的IDE预处理项目选项。

+0

谢谢,解决了这个问题。 – David

+1

+1:多边形函数在包含在Windows.h中的wingdi.h中声明。这个声明受宏“#ifndef NOGDI”限制。定义这个宏将导致在Windows.h中排除多边形函数,并且你可以使用你的“Polygon”声明。 – Durgesh

1

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

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

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

0

向名称空间碰撞问好。首先,完全避免这种问题的最好方法是在所有你自己的标识符前加一些明确的前缀。例如,如果您的项目名为“foobar turboencabulator”,则可行的前缀为fbtec…。你应该无条件地做到这一点,因为你永远不会知道操作系统和/或运行时环境将来会引入哪些标识符。 C语言标准为将来的扩展提供了一些名称空间(用于标识符的保留前缀),但这是针对C而不是OS和运行时。

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

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

你标记你的问题C所以我建议你接受这个事实:我建议你放下typedef如果你写的只是

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

没有类型定义,然后Polygon将在结构体标签的命名空间,这是一个不同的命名空间比一个函数标识符居住在存在的。因此,这将不再与碰撞Windows的Polygon功能。

其缺点是,您必须更改所有变量和参数定义才能引用struct命名空间,即Polygon a变为struct Polygon a。 OTOH在C语言中是惯用的,以明确结构名称空间。

+0

谢谢datenwolf,问题是我无法更改这部分代码,因为它是生成代码。罗德里戈的答案解决了这个问题。 – David