我知道使用沒有原型的函數是錯誤的。 但是當我在擺弄時,我碰到了這個奇怪的和衝突的行爲。隱式函數聲明的行爲
TEST1
#include <stdio.h>
#include <limits.h>
void main(){
char c='\0';
float f=0.0;
xof(c,f);/* at this point implicit function declaration is
generated as int xof(int ,double); */
}
int xof(char c,float f)
{
printf("%d %f\n", c,f);
}
隱函數聲明將是int XOF(INT,雙);
誤差是
variablename.c:8:5: error: conflicting types for 'xof' int xof(char c,float f)
我明白這一點,因爲隱式生成函數聲明(默認整數值爲INT和小數爲DOUBLE哪些)不匹配以下函數定義
TEST2
#include <stdio.h>
#include <limits.h>
void main(){
unsigned int a =UINT_MAX;
int b=0;
xof(a); /* implicit function declaration should be int xof(int); */
}
int xof(unsigned a,int b)
{
printf("%d %d\n", a,b);
}
隱式函數聲明爲int xof(int);應與函數定義
的衝突,但是這個運行良好(無差錯)和輸出是 與「A」表現爲「INT」值和「B」具有「未定義垃圾」
-1 12260176
有人可以解釋這一點。 在此先感謝。
C在使用前需要正確的聲明。其他任何東西都是無效的C!因此,問「爲什麼這個C代碼做了什麼 - 它不是C代碼,而且你不使用標準的兼容編譯器或忽略警告。根據你的介紹,你很清楚。」 – Olaf
舊版本的C標準允許的函數參數推理,第二個例子可以通過這些鬆散的規則「偷渡」,這是C移動到總是需要前向聲明的原因之一 – AShelly
只需更新一個不超過18年的編譯器,然後你 – Lundin