簡體   English   中英

const typedef; 在C和C ++中

[英]const typedef; in C and C++

在C和C ++中允許使用如下語句的原因是什么?

const typedef;

它似乎沒有任何實際意義。

此外,你可以這樣做: const; typedef;

編輯:@AndreyT指出它不是標准定義的行為。 對於完整的答案,我想知道GCC開發人員在決定這類代碼應該可編譯時出現的任何可能的優勢。

這看起來像是一種墮落的宣言形式。

在C聲明中不是聲明。 這是一個宣言。 你上面所擁有的是不允許的。

6.7聲明

2聲明應至少聲明聲明者(函數的參數或結構或聯合的成員除外),標記或枚舉的成員。

在C ++聲明中是一個聲明。 但是仍然不允許你擁有上述內容。 來自C ++ 03

7聲明

3在一個簡單聲明中,只有在聲明一個類(第9節)或枚舉(7.2)時,也就是說,當decl-specifier-seq包含一個類說明符時,可以省略可選的init-declarator-list。使用類鍵(9.1)或枚舉說明符詳細說明了類型說明符。

如果某些編譯器在C或C ++代碼中允許這樣做,那么它必定是該編譯器的一個怪癖。 您應該將該問題提交給作者。

您可能知道,C和C ++的語法不僅僅由語法指定。 僅僅通過語法來完成它將是太復雜或完全不可能的。 語法附帶的文本會施加一些額外的限制。 編譯器通常會尊重語法本身,但是當涉及到那些精心設計的額外限制時......許多編譯器允許一些違規行為漏掉。

我會做出有根據的猜測,這必須是“空宣言”擴展的副作用。 從一開始,空聲明在C和C ++中是非法的。 例如,此代碼一直是非法的

void foo() {}; // In file scope

因為它遵循帶有空聲明的函數定義。 但是,幾乎所有編譯器都接受它,允許空聲明作為擴展。 出於同樣的原因你可以寫

;;;; // In file scope

在文件的中間,並編譯您的代碼。 您的示例中的內容也是一個空聲明,您在其中添加了一些無關緊要的限定符和存儲類說明符。

PS糾正我,如果我錯了,但C ++ 11合法化空聲明。 我不確定C11。

暫無
暫無

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

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