在這個問題中,您嘗試在編譯器中進行操作以嘗試推導語言規則。這通常是一個壞主意,因為(a)在許多情況下,很難觀察到破壞規則的影響,并且(b)編譯器可能會出錯。相反,標準是有關語言規則的權威來源,因此應通過參考標準來回答問題。
繼續:您的代碼包含約束C11 6.7.4 / 3,您在問題中引用了該約束。違反約束的后果是編譯器必須發出診斷程序,而診斷程序必須這樣做。
然后,您要進行一些修改,我假設您的意思是以下代碼:
static int n = 5;
void inline foo() { n = 66; }
void foo();
int main() { return 0; }
如您所引用的第一句話(自6.7.4 / 7起)所涵蓋的那樣,的定義foo()不是內聯定義,因為TU中的所有文件作用域聲明都沒有包含說明符,這是不正確的。(該句子旨在否認此前提)。
由于它不是內聯定義內聯函數 內部鏈接,因此沒有問題,n = 66并且代碼正確。
標準不是在說,或者至少我看不到內聯函數 內部鏈接,是提供外部定義的內聯函數是否停止成為內聯函數?
內聯函數定義絕不是外部定義。在6.7.4 / 7“內聯定義不為函數提供外部定義”中明確指出了這一點。
也許將“內聯函數定義”和“函數定義與說明符”混為一談會引起您的困惑。
另一個問題出現了:為什么外部內聯函數是沒有用的東西?
如果您指的 是該問題未涉及的另一個主題的關鍵字,請參見此處。具有外部鏈接的內聯函數當然不是沒有用的。