[英]Is `function-definition` a `declaration`?
在 C11 標准中
6.9 外部定義
句法
translation-unit: external-declaration translation-unit external-declaration external-declaration: function-definition declaration
在哪里
6.9.1 功能定義
句法
function-definition: declaration-specifiers declarator declaration-listopt compound-statement declaration-list: declaration declaration-list declaration
和
6.7 聲明
句法
declaration: declaration-specifiers init-declarator-listopt ; static_assert-declaration declaration-specifiers: storage-class-specifier declaration-specifiersopt type-specifier declaration-specifiersopt type-qualifier declaration-specifiersopt function-specifier declaration-specifiersopt alignment-specifier declaration-specifiersopt init-declarator-list: init-declarator init-declarator-list , init-declarator init-declarator: declarator declarator = initializer
...
聲明指定了一組標識符的解釋和屬性。 標識符的定義是對該標識符的聲明:
- 對於一個對象,導致為該對象保留存儲空間;
- 對於函數,包括函數體;
- 對於枚舉常量,是標識符的(唯一)聲明;
- 對於 typedef 名稱,是標識符的第一個(或唯一)聲明。
function-definition
是declaration
嗎?
使用function-specifier
的declaration
是function-definition
還是其他什么? (“6.7.4 函數說明符”介紹了內聯函數的定義,所以看起來function-definition
是declaration
?)
在external-declaration
,為什么function-definition
被單獨列出而不是包含在declaration
?
謝謝。
函數定義不是形式 C 語法中的聲明。 這從整個標准的語法從句中可以明顯看出,它們呈現了形式語法。
函數定義是一種聲明,它確實聲明了函數的標識符,也定義了函數。 這在 C 2018 6.9 5 中有說明,它說“外部定義是一個外部聲明,它也是一個函數(內聯定義除外)或對象的定義......”
函數定義的語法需要與其他聲明分開指定,因為它們的形式與其他聲明不同。 但是,形式語法中的標記可以命名為non-function-definition-declaration和function-definition-declaration而不是declaration和function-definition 。 名稱對語法的定義沒有影響,並且為實際上是聲明子集的內容選擇聲明這一事實只是命名的產物。
標識符的定義是對該標識符ref的聲明
聲明的概念並不完全對應於語法符號聲明。 外部聲明(語法符號,斜體)不一定是聲明,但外部聲明(羅馬字體)顯然是一種聲明。 我相信對標准沒有其他合理的解釋。
語法是為機器(解析器)設計的,而英文文本是為人類設計的,所以這里和那里都有差異。
C 不允許在塊內定義函數。 所有函數定義都必須位於翻譯單元的頂層。 由於翻譯單元的語法是一系列 external-declaration,所以我們只能在external-declaration
的擴展中找到函數定義是合乎邏輯的。
當然,翻譯單元的頂層不限於函數定義。 它還可以包括聲明,包括函數聲明。 但它不能包括(可執行的)語句,在 C 語法的上下文中,這些statements
被稱為statements
。
簡而言之,C 語法包含三個相互排斥的類別,我們可以稱之為“類似語句的事物”:
statement
declaration
function-definition
阻止列表包含前兩個類別中的任何一個; 翻譯單元的頂層包含后兩個中的任何一個。 沒有任何上下文可以接受所有三個。
這些類別不是絕對的。 另一種語言(或語法)可能使用不同的措辭。 (例如,在 C++ 中,聲明是語句,函數定義可以出現在更多上下文中。)
在普通語言中,將函數定義稱為聲明是很常見的。 顯然,它聲明了一個標識符命名一個函數。 在這個意義上,甚至標准偶爾也會使用“聲明”。 但它不屬於declaration
的語法范疇。
同樣,聲明也不屬於statement
的語法類別,盡管在非正式語言中,包含聲明是很常見的。 (但這是一個錯誤:聲明不能被標記,甚至不能被標記。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.