這將編譯得很好。但是你所做的是聲明的功能。這與在頂層添加(非原型)聲明相同。
int hey();
// ^empty parens means it's not a prototype
如果聲明是初始化程序的一部分,則可以在聲明中調用函數。
#include <stdio.h>
int main()
{
int reply=hey();
// ^here the function is called, even though this is a declaration,
// because the value is needed.
return 0;
}
int hey(){
return printf("Hello");
// a function returning `int` ought to `return ` an int!
};
但通常調用一個函數,你只需將在(無申報)表達式語句調用。
#include <stdio.h>
int main()
{
int reply; // declaring a variable
int hey(); // declaring a function
(void) hey(); // function call, casting return value to (void)
return 0;
}
int hey(){
return printf("Hello");
};
存在這樣只有最後聲明可以包含一個函數調用一些早期的編譯器的限制。 C99(和大多數「現代」編譯器)已經放寬了這個限制,函數調用現在可以在初始化器中使用而不受懲罰。
IIRC splint
語法檢查器對初始化函數中的函數調用具有相同的限制。
可以考慮不良作風,但它並不一定不正確調用函數沒有原型。可以肯定的是,它消除了編譯器從類型視角檢查調用是否有意義的能力。但是,你真的必須做的是不要搞砸了。
非原型函數將默認爲標準調用約定,這意味着所有整數ARGS(字符,短,INT)促進int
和所有浮ARGS促進double
。這些促銷也適用於使用#include <stdarg.h>
(和我們心愛的printf
)的可變參數函數,所以我認爲知道如何調用非原型函數非常有用。
我有一些「不要搞砸」代碼here,通過函數指針調用非原型函數。這一切都符合標準(接近我的數字),但我不知道如何對這個函數指針進行原型設計,這可能指向許多刻板模式之一。使用可變參數(...)
是不正確的,因爲它不是一回事。原型沒有適當的方法,所以指針只被宣佈爲void (*fp)();
。
您是否嘗試在包含後添加原始類型? int hey(); –
這是不正確的或者至少非常不尋常的C語法。我不會依賴編譯器決定如何處理它。 – Tobia
@Tobia僅僅因爲你從未見過它並不意味着C標準沒有明確定義它的含義。 –