2015-10-07 30 views
2

具體來說,我的問題是,給出這個宏:演員陣容會在C中失敗嗎?

#define FAKE_VAL(type) ((type)0) 

...有沒有的type任何值(包括結構,函數指針,等等),其中FAKE_VAL(type)會導致編譯時錯誤?

我在問,因爲我有一個宏將一個函數指針作爲參數,並且需要找到它的返回值的大小。我知道函數指針發生的種類和數量的參數,所以我打算寫類似:

sizeof(fptr(FAKE_VAL(arg_type_1), FAKE_VAL(arg_type_2))) 

arg_type_12可能是從字面上任何東西。

+1

我想我們在'type'中排除'';;''或'2'的值,對吧? – user2357112

+0

@ uaer2327112:yep – Functino

回答

2

你不能施放將int數組類型,所以

FAKE_VAL(int[5]); 

將失敗。 Try it!

3

當然有。

struct fred(即不是指針) - 如何將0(標量類型)轉換爲結構(非標量類型)? 任何文字值FAKE_VAL("hi")給出(("hi")0) - 這是什麼意思?

+0

在這種特殊情況下,假定FAKE_VAL的參數是一個類型。請參閱user2327112的評論。 – Functino

+0

'struct fred'是一個類型。也許你的意思是一個標量類型? – John3136

+0

@ John3136:'「你好」不是一種類型,所以你的其他例子不起作用。但是'struct fred'符合條件並且打破了cast,特別是如果'struct fred'是一個不完整的類型。 – user2357112

-1

typecast用於通知編譯器,程序員已經考慮了以不同於聲明的方式使用變量的副作用。這會導致編譯器關閉其檢查。所以對於類型轉換你不會得到警告/錯誤。
是的。它將任何類型的類型轉換爲類型轉換。我的錯。 但是,當程序實際運行時,這可能導致分段錯誤/錯誤。

+0

當然,它不僅僅是「關閉類型檢查」。 – user2864740

+0

@ user2864740'2 ==(int)2.7;' - 毫無疑問。 – Functino

0

給它一個更系統的答案。在C cast中只允許用於算術和指針類型。因此,任何屬於structunion或數組的類型都會導致編譯時錯誤。