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。
试图取消定义:
#ifdef Polygon
#undef Polygon
#endif
没有帮助..
编辑:通过 rodrigo 的回答解决了问题。
将windows.h
的包含和struct Polygon
的定义分开到两个不同的文件中。
包含 windows.h
的文件将定义一个采用字符串参数(和其他非结构多边形参数)并调用 ShellExecute
的函数。函数导出。
定义struct Polygon
的文件不能包含windows.h,但可以将struct数据转换为字符串格式,并调用其他文件中定义的导出函数。
#undef Polygon
将不起作用,因为 Polygon()
是一个真正的函数,而不是宏。在 Windows 中,由于 Unicode 与 ANSI 的区别,该技巧主要适用于至少接受一个字符串参数的函数。
如果您只需要 ShellExecute()
函数,您可以通过在包含 Windows.h
:
之前定义 NOGDI
来省略所有 GDI 函数
#define NOGDI
#include <windows.h>
或者,您可以将 NOGDI
宏添加到 IDE 的预处理器项目选项中。
向名称空间冲突问好。首先,完全避免此类问题的最佳方法是为所有您自己的标识符添加明确的前缀。例如,如果您的项目名为 "foobar turboencabulator",则可行的前缀为 fbtec…
。您应该无条件地这样做,因为您永远不会知道 OS and/or 运行时环境将来可能会引入哪些标识符。 C 语言标准为将来的扩展提供了一些名称空间(标识符的保留前缀),但那是针对 C 而不是 OSs 和运行时。
您已经得到了如何拆分编译单元的答案。但是您的情况还有另一种可能性,我强烈建议您考虑一下。您的 struct/typedef 定义是
typedef struct Polygon
{
U8 numElements;
PolygonPoints element[15];
}Polygon;
你标记了你的问题 C
所以我建议你接受这个事实:我建议你放弃 typedef
。 如果你只写
struct Polygon
{
U8 numElements;
PolygonPoints element[15];
};
没有 typedef,那么 Polygon
将存在于 仅 struct tag 命名空间中,它与 one 函数标识符所在的命名空间不同。因此它将不再与 Windows.
的 Polygon
函数冲突
这样做的缺点是,您必须更改所有变量和参数定义以引用结构名称空间,即 Polygon a
变为 struct Polygon a
。 OTOH 在 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。 试图取消定义:
#ifdef Polygon
#undef Polygon
#endif
没有帮助..
编辑:通过 rodrigo 的回答解决了问题。
将windows.h
的包含和struct Polygon
的定义分开到两个不同的文件中。
包含 windows.h
的文件将定义一个采用字符串参数(和其他非结构多边形参数)并调用 ShellExecute
的函数。函数导出。
定义struct Polygon
的文件不能包含windows.h,但可以将struct数据转换为字符串格式,并调用其他文件中定义的导出函数。
#undef Polygon
将不起作用,因为 Polygon()
是一个真正的函数,而不是宏。在 Windows 中,由于 Unicode 与 ANSI 的区别,该技巧主要适用于至少接受一个字符串参数的函数。
如果您只需要 ShellExecute()
函数,您可以通过在包含 Windows.h
:
NOGDI
来省略所有 GDI 函数
#define NOGDI
#include <windows.h>
或者,您可以将 NOGDI
宏添加到 IDE 的预处理器项目选项中。
向名称空间冲突问好。首先,完全避免此类问题的最佳方法是为所有您自己的标识符添加明确的前缀。例如,如果您的项目名为 "foobar turboencabulator",则可行的前缀为 fbtec…
。您应该无条件地这样做,因为您永远不会知道 OS and/or 运行时环境将来可能会引入哪些标识符。 C 语言标准为将来的扩展提供了一些名称空间(标识符的保留前缀),但那是针对 C 而不是 OSs 和运行时。
您已经得到了如何拆分编译单元的答案。但是您的情况还有另一种可能性,我强烈建议您考虑一下。您的 struct/typedef 定义是
typedef struct Polygon
{
U8 numElements;
PolygonPoints element[15];
}Polygon;
你标记了你的问题 C
所以我建议你接受这个事实:我建议你放弃 typedef
。 如果你只写
struct Polygon
{
U8 numElements;
PolygonPoints element[15];
};
没有 typedef,那么 Polygon
将存在于 仅 struct tag 命名空间中,它与 one 函数标识符所在的命名空间不同。因此它将不再与 Windows.
Polygon
函数冲突
这样做的缺点是,您必须更改所有变量和参数定义以引用结构名称空间,即 Polygon a
变为 struct Polygon a
。 OTOH 在 C 语言中明确说明结构名称空间是惯用的。