3 回答
TA貢獻1872條經驗 獲得超4個贊
一般來說:
static?const
因為它尊重范圍和類型安全。
我能看到的唯一警告是:如果您希望在命令行中定義變量。還有一種選擇:
#ifdef?VAR?//?Very?bad?name,?not?long?enough,?too?general,?etc.. ??static?int?const?var?=?VAR; #else ??static?int?const?var?=?5;?//?default?value #endif
只要有可能,不要使用宏/省略號,而是使用類型安全的替代方案。
如果您確實需要使用宏(例如,您希望__FILE__或__LINE__),那么您最好非常小心地命名宏:在命名約定?助推建議所有大寫,從項目名稱(這里是Boost_)開始,在仔細閱讀庫時,您會注意到這是(通常),后面是特定區域(庫)的名稱,然后有一個有意義的名稱。
它通常是長篇大論的名稱:)
TA貢獻1786條經驗 獲得超11個贊
static const int var = 5;#define var 5enum { var = 5 };
如果需要傳遞指針,則必須使用(1)。 因為(2)顯然是一個選項,所以不需要傳遞指針。 在調試器的符號表中,(1)和(3)都有一個符號-這使得調試更容易。更有可能的是(2)沒有符號,讓你想知道它是什么。 (1)不能用作全局范圍內數組的維度;(2)和(3)都可以。 (1)不能用作函數范圍內的靜態數組的維度;(2)和(3)都可以。 在C99下,所有這些都可以用于本地數組。從技術上講,使用(1)將意味著使用VLA(可變長度數組),盡管“var”引用的維度當然將固定在大小5。 (1)不能在開關語句之類的地方使用;(2)和(3)都可以。 (1)不能用于初始化靜態變量;(2)和(3)都可以。 (2)可以更改您不希望更改的代碼,因為它是由預處理器使用的;(1)和(3)都不會產生意外的副作用。 您可以檢測預處理器中是否設置了(2);(1)和(3)都不允許這樣做。
TA貢獻1812條經驗 獲得超5個贊
特別是C語言?在C中,正確的答案是:使用#define(或,如適當的話,enum)
類的作用域和類型屬性是有益的。const物體,在現實中constC中的對象(相對于C+)不是真正的常量,因此在大多數實際情況下通常是無用的。
因此,在C中,選擇應該由您計劃如何使用常量來決定。例如,您不能使用const int對象作為case標簽(而宏將工作)。你不能用const int對象作為位字段寬度(而宏可以工作)。在C89/90中,您不能使用const對象指定數組大小(而宏可以工作)。即使在C99中,您也不能使用const對象來指定數組大小,當需要非-VLA陣列。
如果這對你很重要,那么它將決定你的選擇。大多數時候,你別無選擇,只能用#define在C中,不要忘記另一種選擇,它在C中產生真正的常數-enum.
在C+中const對象是真正的常量,所以在C+中,使用const變式(不需要顯式)static在C+中)。
- 3 回答
- 0 關注
- 516 瀏覽
添加回答
舉報
