標頭檔案中定義 const 全域性變數應注意的問題

2021-06-16 23:04:37 字數 1237 閱讀 2427

我們知道,在 c++(但不是在 c 語言)中,const 限定符對預設儲存型別稍有影響。在預設情況下,全域性變數的鏈結性為外部的,但 const 全域性變數的鏈結性為內部的。也就是說,在 c++ 看來,全域性 const 定義就像使用了 static 說明符一樣。

因此,可以將 const 常量定義在標頭檔案中供工程中的多個其它檔案包含引用,並且編譯時不會產生變數重複定義的錯誤。當然,也可以用 #define 巨集定義。

一般常量定義並無問題,但是,如果 const 要限定的是指標就須特別注意。這裡以字元陣列為例來說明。

// const_header.h

#ifndef const_header_h_

#define const_header_h_

const char* const_string = "wangqi"; // 錯誤!指標 const_string 並非 const 常量,所以該標頭檔案

// 被多個檔案包含時,會有變數重複定義的編譯錯誤。

const char* const const_string = "wangqi"; // 正確,const_string 是指向常量的常量指標。

const char const_string = "wangqi"; // 正確,const_string 是 const char [7] 型別。

char* const const_string = "wangqi"; // 正確,const_string 是常量指標。

#define const_string "wangqi"; // 正確,傳統用法。

static char const_string = "wangqi"; // 正確

static char* const_string = "wangqi";

static const char* const_string = "wangqi"; // 正確

namespace // 正確

namespace // 正確

namespace // 正確

#endif // const_header_h_

附:用 const 限定符比 #define 好的理由。

1. const 常量能明確指定型別;

2. 可以使用 c++ 的作用域規則將定義限制在特定的函式或檔案中;

3. 可以將 const 用於更複雜的型別,如陣列和結構。

全域性變數在標頭檔案中「定義」

看著標題,定義上面加了乙個引號,這個得注意了。怎麼解釋呢,一般而言,變數只能定義在.c檔案中,宣告變數才在.h檔案中。下面就打破常規,把定義變數的語句放在.h檔案中,但是對實際而言,變數定義在標頭檔案中是表面上的。下面直接給出 有三個檔案a.h a.c main.c a.h裡面的 csharp vi...

const變數定義於標頭檔案中

一。首先要知道強弱符號 編譯器編譯原始檔時會把原始檔的全域性符號 global symbol 分成強 strong 和弱 weak 兩類傳給彙編器,而隨後彙編器則將強弱資訊編碼並儲存在目標檔案的符號表中。那麼何謂強弱呢?編譯器認為函式與初始化了的全域性變數都是強符號,而未初始化的全域性變數則成了弱符...

關於標頭檔案中定義的全域性變數的包含

在標頭檔案中定義了乙個變數,若另乙個檔案包含此檔案則會再產生乙個相同變數的定義,在linux環境中編譯時會發生如 menu.o sbss 0x0 multiple definition of is refresh living time thread created main.o sbss 0x0 ...