我有一段這樣的代碼:
#include <stdio.h>
int add(const int x, const int y);
int main()
{
printf("%d", add(9, 8));
return 0;
}
int add(int x, int y)
{
return x y;
}
我用const引數向前宣告了函式“add”,然后我在沒有const引數的情況下定義了它,當我編譯它時,編譯器沒有任何抱怨。
程式的輸出是: 17. 為什么會發生這種情況?
uj5u.com熱心網友回復:
好吧,函式宣告和函式定義必須兼容,我們都知道。所以相同的名稱和相同的回傳型別和引數型別。所以我們從C11 6.7.6.3p15知道:
對于要兼容的兩個函式型別,[...] 相應的引數應具有兼容的型別。[...]
但是,在該文本的后面有一個明確的后門:
(在確定型別兼容性 [...] 時,使用限定型別宣告的每個引數都被視為具有其宣告型別的非限定版本。)
例如,型別限定符是const。它被忽略了。您可以放置??任何型別限定符,并且在檢查函式宣告是否彼此相同時會忽略它。
int func(int n);
int func(volatile int n);
int func(const int n);
int func(const volatile int n);
int func(int n) {
return n;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/382571.html
