C 中的內部鏈結屬性。。。

2021-05-04 02:19:06 字數 1401 閱讀 4957

template

class myclass ;

char const* s = "hello";

myclassx; // error: s is pointer to object with internal linkage

這裡"hello"是個內部鏈結(internal linkage)物件

但是:template

class myclass ;

extern char const s = "hello";

myclassx; // ok

(1)  "hello"是字串常量,因為不是「變數」,所以沒有內部、外部鏈結屬性。有內部外部鏈結屬性的是那個s。

(2)  c++規定,有const修飾的變數,不但不可修改,還都將具有內部鏈結屬性,也就是只在本檔案可見。(這是原來c語言的static修飾字的功能,現在const也有這個功能了。)又補充規定,extern const聯合修飾時,extern將壓制const這個內部鏈結屬性。於是,extern char cosnt s將仍然有外部鏈結屬性,但是還是不可修改的。

(3)  1.char const* s = "hello";

myclassx; // error: s is pointer to object with internal linkage

我不知道lz標註的error資訊是怎樣得到的,在vs2005下的錯誤資訊是:

invalid template argument for 'myclass', expected compile-time constant expression

主要原因在於template是在編譯時就生成的,而s是乙個指標變數,它的值是執行時可知。

(4)    一下這段話是原作者的感悟,本人有些不是很理解,但是也暫時摘錄在此。

nontype template parameters要求是在編譯或者鏈結時值必須是可知的。對於內部鏈結物件來說,對於其他編譯單元不可見,而在編譯期至少模板的例項化是共享的(blue_zyb說的我很認同),但是如果內部鏈結物件可以作為template argument(模板實參)會發生語義上的錯誤,例如字串文字量(如「abcx」,前面我說是字串常量,這種稱法不準確)

他傳遞給模板的是個指標,而非他的值("abcx").況且如果還有乙個"abcx"的話,也是傳遞的是位址,並且這兩個位址從理論上說是不相同的(即使某些編譯器會做優化,讓其相同)。

但是他對我們使用者來說不相同。但同時我們要說兩個字串文字量的值是相同的。應該共享乙個類的定義(注:這是我們使用者的角度來談),而實際上編譯器無法以值的

方式傳遞這種常量,而以位址的方式傳遞常量。這樣如果編譯器生成了不同的類的實現,這就違法了模板給我的資訊(相同值的非型別型別『nontype template parameters』模板引數生成的物件是共享乙個例項的類的),因此編譯器不應該生成相應的類的實現。

C 中的內部鏈結和外部鏈結

c 中的內部連線與外部連線 apr 22nd,2007 by king 一.在學習內部連線與外部連線之前,必須先弄清楚幾個概念 1.宣告 乙個宣告將乙個名稱引入乙個作用域。在c 中,在乙個作用域中重複乙個宣告是合法的。以下都是宣告 int foo int,int 函式前置宣告 typedef int...

c 內部鏈結 外部鏈結

c 內部鏈結與外部鏈結 2009年03月12日 星期四 11 07 在說內部連線與外部連線前,先說明一些概念。1.宣告 乙個宣告將乙個名稱引入乙個作用域 在c 中,在乙個作用域中重複乙個宣告是合法的 以下都是宣告 int foo int,int 函式前置宣告 typedef int int type...

C 的內部鏈結與外部鏈結問題

在說內部連線與外部連線前,先說明一些概念。1.宣告 乙個宣告將乙個名稱引入乙個作用域 在c 中,在乙個作用域中重複乙個宣告是合法的,以下都是宣告 class bar 類前置宣告 typedef int int typedef 宣告 extern int g var 外部引用宣告 friend tes...