3 回答

TA貢獻1895條經驗 獲得超7個贊
不,通常,您不應該在C中使用const限定對象來創建名稱常量。為了在C語言中創建命名常量,您應該使用宏(#define)或枚舉。實際上,就您所暗示的意義而言,C語言沒有常量。(在這方面,C與C ++明顯不同)
在C語言中,常量和常量表達的概念與C ++的定義非常不同。在C中,常數表示文字值,例如123。這是C 中常量的一些示例
123
34.58
'x'
C中的常量可用于構建常量表達式。但是,由于任何類型的const限定對象都不是C中的常量,因此無法在常量表達式中使用它們,因此,您不能在需要使用常量表達式的情況下使用const限定對象。
例如,以下不是常數
const int C = 123; /* C is not a constant!!! */
并且由于上述C內容不是常量,因此不能用于在文件范圍內聲明數組類型
typedef int TArray[C]; /* ERROR: constant expression required */
不能用作案例標簽
switch (i) {
case C: ; /* ERROR: constant expression required */
}
不能用作位域寬度
struct S {
int f : C; /* ERROR: constant expression required */
};
它不能用作具有靜態存儲持續時間的對象的初始化程序
static int i = C; /* ERROR: constant expression required */
它不能用作枚舉初始化器
enum {
E = C /* ERROR: constant expression required */
};
即它不能在需要常量的任何地方使用。
這似乎違反直覺,但這是C語言定義的方式。
這就是為什么您#define在使用的代碼中看到大量的-s的原因。同樣,在C語言中,const限定對象的使用非常有限。它們基本上完全沒有用做“常量”,這就是為什么在C語言中,您基本上不得不使用#define或枚舉來聲明真正的常量。
當然,在使用const限定對象為您工作時(即它按您的意愿進行工作)的情況下,由于在范圍和類型方面,它確實在許多方面優于宏。在適用的情況下,您可能應該首選此類對象,但是在一般情況下,您必須考慮上述限制。

TA貢獻1780條經驗 獲得超1個贊
常量比define
s 更可取。有幾個優點:
類型安全。盡管C是弱類型語言,但是使用C會
define
失去所有類型安全性,這將使編譯器為您解決問題。易于調試。您可以通過調試器更改常量的值,而
define
預處理器會在代碼中自動將s更改為實際值,這意味著如果要出于測試/調試目的更改值,則需要重新編譯。

TA貢獻1851條經驗 獲得超4個贊
也許我一直在錯誤地使用它們,但是至少在gcc中,不能在case語句中使用常量。
const int A=12;
switch (argc) {
case A:
break;
}
- 3 回答
- 0 關注
- 612 瀏覽
添加回答
舉報