2012-06-06 35 views
2

說我有類似下面的那些一兩個功能:有編譯申報與定位調試指針變量

unsigned char PlusTwo(unsigned char value) 
{ 
    return (value + 2); 
} 
unsigned char PlusTwoUsingPtr(unsigned char *value) 
{ 
    return (*value + 2); 
} 

如果我想測試的第一功能,而我開發的,沒有問題,我不得不是這樣的:

PlusTwo(8); 

編譯器會自動爲我在內存中的某個地方放置一個常量。但是,爲了測試第二個函數,它變得更加複雜。首先,我必須聲明變量,然後傳遞函數的變量的地址:

unsigned char eight = 8; 
PlusTwoUsingPtr(&eight); 

這不是可怕耗時的,但它是惱人的(特別是在C89/ANSI功能塊的其中variables have to be declared at the beginning) 。有沒有一些技巧可以讓我只用一行代碼來測試這個函數,讓編譯器聲明&在某個地方給我指向一個常量?

+0

指向隱式創建的指針不會將其剪切。根據其簽名,「PlusTwoUsingPtr」寫入「* value」是完全合理的(即使沒有強制轉換和UB等)。 – delnan

回答

5

可以使用文字與標量類型的化合物:

PlusTwoUsingPtr(&((unsigned char){8})); 

化合物文字是在C99引入的功能。 有關信息,該對象是可變的(具有靜態存儲持續時間),您也可以在函數中對其進行修改。

+0

有趣...似乎工作。 8是否存儲爲一個文字字符串? – Robert

+0

@Robert不,它也有靜態存儲時間,但可以修改。 – ouah

+1

即使沒有明確使用C99標準,GCC似乎也支持它,因爲它是GCC對C89默認擴展的一部分。 – JAB