2012-08-12 33 views
0

當爲整數創建自定義typedef時,編譯器在使用默認數字類型時可能會發出警告嗎?在編譯器中禁用默認數字類型

例如,

typedef int_fast32_t kint; 

int_fast32_t test=0;//Would be ok 
kint test=0; //Would be ok 
int test=0; //Would throw a warning or error 

我們轉換一個大項目和默認int尺寸上的平臺是32767這是造成一些問題。此警告會警告用戶不要在代碼中使用整數。

如果可能的話,如果這可以在GCC和VC++ 2012上工作,那將會很棒。

+0

如果沒有其他方法:'#define int #warning(); int'或者只是'#define int not-complied-abracadabra'來強制錯誤 – RiaD 2012-08-12 21:20:42

+0

不,你不能在宏定義中使用預處理器指令,並且該語法不會起作用。 – 2012-08-12 21:22:38

+0

@Keith但是你可以使用'_Pragma' /'__pragma'。通過宏重新定義關鍵字是不合法的,但它可能會起作用。我不確定這是否是一個好主意,即使除了實際考慮之外。 – 2012-08-12 21:32:15

回答

1

我相當確定海灣合作委員會沒有這樣的選擇,如果VC真的這麼做,我會感到驚訝。

我建議編寫一個程序,檢測對源代碼中預定義類型的引用,並在構建過程中自動調用該工具。搜索某些關鍵字可能就足夠了。

請務必將其限制在您自己的源文件中;預定義和第三方頭文件可能會廣泛使用預定義的類型。

但我不會絕對禁止。有許多使用預定義類型的標準庫函數。例如,在c = getchar()中,將c聲明爲int以外的內容是沒有意義的。而且還有這樣的事情for (int i = 0; i <= 100; i ++) ...

理想的情況下沒有問題,我們的目標應該是使用預定義的類型正確。語言從來沒有保證的int可超過32767(但「正確」的使用是很難或不可能自動驗證。)

0

我會先做一個替換,然後徹底記錄下來。

您可以使用預處理指令:

#define int use kint instead 

注意,在技術上這是不確定的行爲,如果你這樣做,包括第三方的頭前,這個定義就會遇到麻煩。

0

我會建議進行批量更換int - >old_int_t在你移植的開始。通過這種方式,您可以繼續修改代碼而不會受到大的限制,同時可以訪問所有尚未更新的地方。

最終,在您的工作結束時,所有old_int_t應該消失。

0

即使人們可以以某種方式取消定義關鍵字int,那也不會阻止該類型的使用,因爲在很多情況下編譯器最終會使用該類型。除了明顯的整數文字情況之外,還有一些涉及整數提升的細微情況。例如,如果int碰巧是64位,則將使用類型int而不是uint32_t執行類型爲uint32_t的兩個變量之間的操作。儘管可以指定某些變量代表數字(應該在實際時應該急於提升),而其他變量代表包含代數環(不應該提升)的成員,但我知道沒有設施做這樣的事情。因此,int是不可避免的。