2013-06-20 73 views
1

我目前正在更新一些代碼,我碰到一個代碼對time_t變量與signed long相同的大小進行了假設。這段代碼適用於我們以前的平臺(顯然在Coldfire上是如此),但我們正在轉向一個新的平臺。有沒有在預處理條件中使用sizeof的方法?

現在我知道,我們不應該對一個time_t變量的大小來做出假設,因爲這是not well defined.但我真的不想改寫它的工作基於這個假設此刻的所有代碼行。

理想我想這樣做:

#if sizeof(time_t) != sizeof(LONG) 
#error size assertion failed 
#endif 

一次,並用它做。我知道sizeof()不能用於像這樣的條件預處理器,所以它是不可能的。

所以我想知道,有沒有什麼辦法可以知道一個time_t將採取的字節數,以便它可以用於預處理條件?

+4

請參閱http://stackoverflow.com/questions/4079243/how-can-i-use-sizeof-in-a-preprocessor-macro和http://www.pixelbeat.org/programming/gcc/static_assert。來自comp.lang.c faq的html – devnull

+0

[sizeof in define](http://c-faq.com/cpp/ifsizeof.ct.html)。 – devnull

回答

3

如果在編譯時失敗後是那麼就做這樣的事情

{ 
    char s1[+sizeof(time_t) - sizeof(LONG) + 1]; 
    char s2[-sizeof(time_t) + sizeof(LONG) + 1]; 
} 

這將無法建立,如果大小不同。

你可以把它放到一個宏中,但是這個錯誤會很神祕。

+0

適用於我,使用C11。 time_t是sizeof(int),但未能用sizeof(char) – 2013-06-20 15:30:15

+0

「* ...編譯失敗」,錯誤會相當神祕。「嘿,所以你真的應該添加一個好評。 – alk

+0

@alk它告訴你錯誤發生在哪一行,所以它只是添加註釋的問題。 – 2013-06-20 15:32:03

相關問題