查看主題。他們在想什麼?爲什麼const暗示C++中的內部鏈接,當它不在C中?
更新:從「靜態」更改爲「內部鏈接」以避免混淆。
舉個例子......把下面的文件:
const int var_a = 1;
int var_b = 1;
...與g++ -c test.cpp
編譯僅出口var_b
。
查看主題。他們在想什麼?爲什麼const暗示C++中的內部鏈接,當它不在C中?
更新:從「靜態」更改爲「內部鏈接」以避免混淆。
舉個例子......把下面的文件:
const int var_a = 1;
int var_b = 1;
...與g++ -c test.cpp
編譯僅出口var_b
。
我相信你的意思是
爲什麼常量意味着內部鏈接在C++
這是真的,如果你在命名空間內聲明一個const對象,那麼它有內在聯繫。
附錄C給出的理由
變化:是顯式聲明的常量,並沒有明確聲明爲extern文件範圍的名稱具有內在聯繫,而在C中,它會對外部鏈接
理由:因爲const對象可以用作C++中的編譯時間值,所以這個特性促使程序員爲每個const提供顯式的初始化值。此功能允許用戶將常量對象放在包含在許多編譯單元中的頭文件中。
它沒有。編寫如下:
const int i = 0;
不作i
靜態的(用C或C++)。
這些概念是正交的,不應該被認爲是同一件事。
Constness是一個訪問權限:它只會告訴你的變量是隻讀的(const)還是write-read(非const)。
靜態是一種生命時間(和技術上的內存本地化)屬性:它告訴變量是否在類的範圍內是全局的(當在類中)或翻譯單元(當與全局變量一起使用時在cpp中)。
它沒有,最明顯的例子是,如果你有一個const成員變量(當然是由構造函數初始化),它不會被該類的所有對象共享,而是個體每一個。
class A {
public:
A(int newx) : x(newx);
private
int x;
}
litb給出了上面的最佳答案。
在C & C++術語靜態具有多重含義(可以管理連接和存儲) 你必須讀Stroustrup的d & E至欣賞他的理由 - 但是當你聲明一個變量是在命名空間範圍常量它自動具有內部鏈接 - 而在C中,你必須聲明它是靜態的,以強制它具有內部鏈接。
當然在C++中,使用靜態控制聯動已棄用中,匿名命名空間可被用來模擬在C++中的內部鍵。在C++
const的變量應該更換預處理器常數 - 而且由於預處理器常量僅在定義它們的文件可見,同樣,常量自動使變量可見只有在定義它的文件。
正如litb說,const對象具有內部鏈接。這是因爲它們旨在以如下方式使用:
// a.cpp
const int BUFSIZE = 100;
char abuf[BUFSIZE];
// b.cpp
const int BUFSIZE = 256
int bbuf[BUFSIZE];
Const和static在C和C++中都是正交的概念。
的const
關鍵字告訴編譯器從呈現爲任何表達的左值禁止可變 - 基本上使它只讀的。
在C中,static
關鍵字取決於它適用於有幾個用途。當應用於函數的變量時,它表示該變量未存儲在函數的本地範圍中,但可通過調用對其進行訪問。當應用於全局變量或函數時,它只能被特定文件訪問 - 換句話說,它只能在編譯單元內訪問(除非聲明爲extern
)。
在C++中,static
關鍵字可以在類定義中使用,使一個變量或函數共享橫跨類的所有實例,而不是本地的每個實例。此外,C++中的靜態類函數只能訪問該類的靜態變量(或它可以訪問的類)。現在,在C++ const
確實給會員內部鏈接到編譯單元,除非他們明確地聲明extern
- 這可能是你所指的。這允許通過使用頭文件在單元之間共享編譯時常量。但請記住,成員並不是真正的靜態 - 而是常量是編譯到每個位置被引用。
的理性有助於完美解釋.. – FaceBro 2016-03-10 00:40:06
似乎非const全局對象也可以初始化,但爲什麼標準不給它內部鏈接? – 2017-09-15 07:54:58