2011-01-20 50 views
3

指定字符數組大小的sizeof命令

char B[200]; 
靜態庫

。它被稱爲

extern char B[]; // (1) 

在包含在客戶端代碼中的頭文件中。 一旦我需要使用sizeof(B)編譯器抱怨並改變

extern char B[200]; // (2) 

平靜下來的編譯器。

庫和客戶端代碼是C++,但它使用C鏈接(頭的外部聲明由

extern "C" { ... } 

周圍是否有任何潛在的問題,如果我使用(2),而不是(1)?

PS我把200爲簡單起見它是在頭文件中定義的恆定隨附庫

庫頭:。

#define MAXLEN 200 

實際上,即使它不是一個庫,但在一個單獨的文件(編譯單元)中,問題是相似的。

有什麼辦法可以(1)在這個大的舊代碼中使用,我可以通過使用(2)來破解?

回答

9

如果庫實現的大小改變了B的大小,那麼您將遇到不匹配以及可能出現的各種錯誤。庫編寫器應提供一個描述數組大小的常量。正如評論中所指出的那樣,圖書館作者可以通過一個常數或函數來編寫sizeof(b),從而使它對庫中的變化具有很強的適應性。

+4

的確沒有想到這件事,圖書館應該定義常量'爲size_t BSIZE =的sizeof(B);`和`的extern常量爲size_t BSIZE;在`它的頭部,或者可能使用函數來返回大小(函數方法更適合於共享庫和位置無關的代碼)。 – 2011-01-20 20:22:47