簡體   English   中英

塊內的變量聲明也是一個定義嗎?

[英]Is a declaration of a variable inside a block also a definition?

C11標准在第6.7 / 5節中規定哪些聲明也是定義:

C11 6.7 / 5

標識符的定義是該標識符的聲明:

- 對於一個對象,導致為該對象保留存儲;

(......)

那么塊內變量的聲明也是一個定義嗎? 例如:

void Bla(void) {
    int a; // Is this declaration also a definition?
}

我在stackoverflow上找到了以下兩個答案,其中聲明塊內變量的聲明也是定義:

但是,“Michael Burr”提供的答案是指6.2.2 / 2“標識符的鏈接”,以便解釋塊范圍內的變量聲明也是定義。 對我來說,他的參考不回答我的問題。 第二個鏈接中的答案未提供對C標准的任何引用。 C標准中是否還有其他段落可用作確認答案的參考?

請提供C標准的參考。

是的,在塊作用域中聲明“對象”(C標准避免使用“變量”一詞)是一個定義,除非該對象的聲明使用存儲類說明符extern ,在這種情況下它不是定義。

以下是從標准中看到的內容(所有參考文獻均為N1570 ,這是與C2011官方文本最接近的免費公開版):

首先, 6.2.2p6

以下標識符沒有鏈接:...沒有存儲類說明符extern聲明的對象的塊作用域標識符。

第二, 6.7p5

標識符的定義是該標識符的聲明:*對於對象,導致為該對象保留存儲;

最后, 6.2.4您需要完整閱讀,但最重要的部分在第5和第6段:

聲明標識符沒有鏈接且沒有存儲類說明符靜態的對象具有自動存儲持續時間...其生命周期從條目擴展到與其關聯的塊,直到該塊的執行以任何方式結束。

因此,如果在塊范圍內聲明一個沒有extern的對象,則它沒有鏈接。 沒有鏈接的對象具有自動存儲持續時間,除非它是使用static聲明的,在這種情況下它具有靜態存儲持續時間,請參閱6.2.4我沒有引用的部分。 具有自動存儲持續時間的對象在進入其聲明的塊時為其保留存儲,並且具有靜態存儲持續時間的對象在程序啟動時為其保留存儲(再次參見6.2.4的部分我沒有引用)。 因此,任何沒有鏈接的對象聲明都是一個定義。

帶有 extern塊作用域中的對象聲明給它外部鏈接而不是定義。如果你在閱讀了我引用的所有部分以及6.9之后你不明白為什么會這樣,請特別提出一個新問題。那。)

C標准第6.2.2p6節規定:

在構成整個程序的翻譯單元和庫的集合中,具有外部鏈接的特定標識符的每個聲明表示相同的對象或功能。 在一個翻譯單元內,具有內部鏈接的標識符的每個聲明表示相同的對象或功能。 沒有鏈接的標識符的每個聲明表示唯一的實體。

缺少的部分是6.2.2p6節:

以下標識符沒有鏈接:聲明為對象或函數以外的任何標識符; 聲明為函數參數的標識符; 沒有存儲類說明符extern聲明的對象的塊作用域標識符。

在塊內部聲明的沒有存儲類說明符(即staticextern )的變量沒有鏈接 ,並且沒有鏈接的變量的每個聲明都是唯一的對象。 由於聲明是唯一的,因此它也有資格作為定義。

另見第6.7p7節:

如果聲明對象的標識符沒有鏈接,則對象的類型應在其聲明符的末尾完成,或者如果它具有初始化器,則由init-declarator的末尾完成; 在函數參數(包括原型)的情況下,需要完成的是調整后的類型(見6.7.6.3)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM