首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 與 C++ 中 const 關鍵字的核心差異深度解析

     編輯:關於C語言

核心結論先行

特性C 語言C++
const 變量本質「只讀變量」,有記憶體分配,可取址「編譯期常量」,進入符號表,不一定分配記憶體
修改行為可透過指標間接修改(未定義行為但常編譯通過)嚴格禁止修改,編譯器優化時直接替換為字面值
作為陣列大小不允許(非編譯期常量)允許(編譯期常量表達式)
外部連結屬性預設 external linkage預設 internal linkage

C 語言:const 是「承諾不修改的變量」


// C 語言
const int a = 10;
int *p = (int *)&a;  // 強制轉型移除 const
*p = 11;             // 編譯通過,執行時可能修改成功(視平台而定)
printf("%d", a);     // 可能輸出 11

關鍵點:C 標準規定修改 const 對象屬於未定義行為,但編譯器通常不阻攔透過指標的修改。const 變量在記憶體中佔據空間,可取地址。

C++:const 是「編譯期常量」


// C++
const int a = 10;
int *p = (int *)&a;  // 編譯錯誤:不能將 const int* 轉為 int*
*p = 11;             // 無法編譯

// 更進一步:const 可用於編譯期計算
const int ROWS = 10, COLS = 20;
int matrix[ROWS + COLS]; // 合法:ROWS+COLS 為常量表達式

C++ 編譯器將 const 整數型變量(經初始化為常量表達式)視為編譯期常量,直接進入符號表,不分配記憶體(除非取址或外部連結)。因此:

  • 不可取址修改(嚴格類型檢查)
  • 可用於陣列維度、case 標籤、模板參數等需常量表達式的場合
  • 預設 internal linkage,避免多檔案定義衝突

跨語言互操作注意事項


// C 標頭檔
extern const int MAX_SIZE; // C: external linkage

// C++ 使用時
extern "C" const int MAX_SIZE; // 需指定 C 連結,否則 C++ 視為 internal

最佳實踐建議

  • C 語言:使用 `#define` 或 `enum` 定義真正的編譯期常量;const 限定指標參數、指向只讀記憶體的硬體暫存器
  • C++:優先使用 `constexpr` (C++11) 明確表達編譯期常量語意;const 配合引用參數避免拷貝
  • 共用標頭檔:在 `#ifdef __cplusplus` 區塊中處理連結屬性差異

總結

C 的 const 是「執行期只讀變量」,C++ 的 const 是「編譯期常量」。這一本質差異導致了類型系統、優化策略、連結模型的連鎖不同。跨語言開發時必須明確區分,避免「以 C 思維寫 C++」或反之產生微妙 Bug。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved