繁体   English   中英

c中的重新定义错误

[英]Redefinition error in c

我必须包含“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。 试图unf:

#ifdef Polygon 
#undef Polygon
#endif

没有帮助..

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

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

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

#define NOGDI
#include <windows.h>

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

将包含windows.hstruct Polygon的定义分成两个不同的文件。

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM