2011-01-06 28 views
1

我有一些來自C++背景的頭文件,這些頭文件使用許多預先聲明的「默認值」來聲明類型。例如C - 如何爲C頭文件中的類型設置默認值

// Header. 

typedef struct 
{ 
    float red; 
    float green; 
    float blue; 
} RGBColor; 

// Defaults. 
const RGBColor kRGB_White = {1.0f, 1.0f, 1.0f}; 
const RGBColor kRGB_Black = {0.0f, 0.0f, 0.0f}; 

...

// Source file. 

RGBColor aColor = kRGB_White; 

問:我需要將這些報頭到C轉換爲兼容的原因。有沒有辦法爲C頭重新創建這些默認值,最好是不改變它們自己的數據結構?

謝謝。

回答

5

爲了避免重複的全局定義的問題,你想改變你的const結構的聲明中的標頭:

extern const RGBColor kRGB_White; 
extern const RGBColor kRGB_Black; 

和地點的定義在獲取連接的單.c文件。

另一種方法是改變const結構是靜態的,因此,當他們在幾個不同的模塊最終會不會傷害:

static const RGBColor kRGB_White = {1.0f, 1.0f, 1.0f}; 
static const RGBColor kRGB_Black = {0.0f, 0.0f, 0.0f}; 

這可能會導致對象在最終鏈接的圖像中出現不止一次,但今天的鏈接器可能足夠聰明以擺脫重複項(我認爲 - 如果您正在執行此操作的結構,可能會進行一些測試與大和/或衆多)。

如果你擔心使用consts初始化其他變量,這樣的:

RGBColor aColor = kRGB_White; 

是罰款,C(看來還是比較常見的程序員認爲C不允許這樣一些理由 - 也許這並不總是允許在預標準的C?)。

+0

我相信很多人都認爲'RGBColor aColor = kRGB_White;`是不是C合法的,因爲`INT FOO [ 4] = {1,2,3,4}; int bar [4] = foo`不合法,並且數組似乎比結構體具有更多的風險。 – SiegeX 2011-01-06 05:10:51

+1

我傾向於推薦`static const`方法 - 它使得編譯器可以使用`const`對象的定義,而不需要鏈接時間跨模塊優化。你也不能用`const`對象初始化靜態存儲持續時間的對象 - 你也應該爲這種情況創建`#define KRGB_WHITE_STATIC {1.0f,1.0f,1.0f}`。 – caf 2011-01-06 05:19:25

1

如果你不能移動的缺省值聲明出來的頭文件,重新定義它們爲宏:

// Might not be a clean solution... 
#define kRGB_White {1.0f, 1.0f, 1.0f} 
#define kRGB_Black {0.0f, 0.0f, 0.0f} 
相關問題