簡體   English   中英

`function-definition` 是一個 `declaration` 嗎?

[英]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-definitiondeclaration嗎?

使用function-specifierdeclarationfunction-definition還是其他什么? (“6.7.4 函數說明符”介紹了內聯函數的定義,所以看起來function-definitiondeclaration ?)

external-declaration ,為什么function-definition被單獨列出而不是包含在declaration

謝謝。

函數定義不是形式 C 語法中的聲明 這從整個標准的語法從句中可以明顯看出,它們呈現了形式語法。

函數定義是一種聲明,它確實聲明了函數的標識符,也定義了函數。 這在 C 2018 6.9 5 中有說明,它說“外部定義是一個外部聲明,它也是一個函數(內聯定義除外)或對象的定義......”

函數定義的語法需要與其他聲明分開指定,因為它們的形式與其他聲明不同。 但是,形式語法中的標記可以命名為non-function-definition-declarationfunction-definition-declaration而不是declarationfunction-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.

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