我被移位圍繞「C」標準和予跨越這個傳來:什麼時候可以聲明一個具有塊範圍的標識符有內部鏈接?
$ 6.7.9.5:
如果一個標識符的聲明具有阻止範圍和 標識符具有外部或內部聯動,聲明應 沒有標識符的初始化。
所以我的問題是關於標題。如果可能的話,我也會喜歡一些例子。
我被移位圍繞「C」標準和予跨越這個傳來:什麼時候可以聲明一個具有塊範圍的標識符有內部鏈接?
$ 6.7.9.5:
如果一個標識符的聲明具有阻止範圍和 標識符具有外部或內部聯動,聲明應 沒有標識符的初始化。
所以我的問題是關於標題。如果可能的話,我也會喜歡一些例子。
static int i; // internal linkage
void f() {
extern int i; // block-scope declaration; refers to i in global scope
// still internal linkage - see 6.2.2/4
}
這意味着以下
#include <stdio.h>
static int x = 1;
int main()
{
int y = 2;
{
extern int x;
printf("x + y = %d\n", x + y);
}
}
這裏內部主要在內部塊變量x
具有內部連接,並且表示相同的變量x
即外主定義。
然而,在該方案
#include <stdio.h>
static int x = 1;
int main()
{
int y = 2;
int x = 3;
{
extern int x;
printf("x + y = %d\n", x + y);
}
}
與指定符extern
聲明的變量x
具有外部連接,它不是作爲可變x
同一前主定義。其原因是其他局部變量x
隱藏了在main之前定義的全局變量x
。
您應該下載更新版本的C標準。查找C11標準的最新草案n1570.pdf。它的語言是更加明確:
標識符6.2.2連桿機構不止一次可製成來指代相同的對象或通過一個稱爲鏈接的進程運行。有三種聯繫:外部,內部和無。
在構成整個程序的翻譯單元和庫的集合中,具有外部鏈接的特定標識符的每個聲明表示相同的對象或功能。在一個翻譯單元內,每個具有內部鏈接的標識符聲明表示相同的對象或功能。每個沒有鏈接的標識符聲明表示一個獨特的實體。
如果對象或函數的文件範圍標識符聲明包含存儲級說明符static
,則該標識符具有內部鏈接。
爲了與存儲類說明extern
在一個範圍,其中該標識符的先前聲明是可見的,如果事先聲明指定的內部或外部聯動,標識符中的後來聲明聯動聲明的標識符與先前聲明中指定的關聯相同。如果前面的聲明不可見,或者前面的聲明沒有指定鏈接,則標識符具有外部鏈接。
如果對於功能的標識符的聲明不具有存儲類說明,其連接是精確地確定,如同其在與存儲類說明extern
聲明。如果對象的標識符聲明具有文件範圍並且沒有存儲類說明符,則其鏈接是外部的。
以下標識符沒有鏈接:聲明爲除對象或函數以外的任何標識符的標識符;一個標識符被聲明爲一個函數參數;在沒有存儲類說明符extern
的情況下聲明的對象的塊範圍標識符。
如果在翻譯單元中,同一標識符同時出現在內部和外部鏈接中,則行爲未定義。
這不是外部鏈接?或者可能不是因爲'x'已經被聲明。這裏是抓住這個嗎? – AnArrayOfFunctions
@FISOCPP不,它是內部鏈接,因爲全局x用關鍵字static定義。 –
@FISOCPP如果在main之前定義的變量x在第二個變量聲明爲extern的塊中不可見,它將具有外部鏈接。 –