2016-08-01 88 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