亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

“靜態Const”與“#Definition”vs“enum”

“靜態Const”與“#Definition”vs“enum”

C++ C
蝴蝶不菲 2019-06-01 10:30:01
“靜態Const”與“#Definition”vs“enum”在下面的C語句中,哪一個更適合使用?static const int var = 5;或#define var 5或enum { var = 5 };
查看完整描述

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_)開始,在仔細閱讀庫時,您會注意到這是(通常),后面是特定區域(庫)的名稱,然后有一個有意義的名稱。

它通常是長篇大論的名稱:)


查看完整回答
反對 回復 2019-06-01
?
Qyouu

TA貢獻1786條經驗 獲得超11個贊

這取決于你需要什么價值。你(以及到目前為止的其他人)忽略了第三種選擇:

  1. static const int var = 5;

  2. #define var 5

  3. enum { 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)都不允許這樣做。

因此,在大多數情況下,更喜歡“enum”而不是備選方案。否則,第一個和最后一個要點很可能是控制因素-如果你需要同時滿足這兩個問題,你必須更努力地思考。

如果您詢問的是C+,那么每次都使用選項(1)-靜態Const。


查看完整回答
反對 回復 2019-06-01
?
慕雪6442864

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+中)。


查看完整回答
反對 回復 2019-06-01
  • 3 回答
  • 0 關注
  • 516 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號