2013-09-27 73 views
4

瞭解UNIX編程,章1.6,more01.c例如:我可以在C函數中使用變量聲明嗎? int f(),i;

int see_more(), reply; 

tried一些類似的代碼:

#include <stdio.h> 

int main() 
{ 
    int hey(), reply; 
    return 0; 
} 

int hey() 
{ 
    printf("Hello"); 
}; 

在日誌中沒有錯誤,但在控制檯中未Hello。有人可以解釋這一點嗎?

+0

您是否嘗試在包含後添加原始類型? int hey(); –

+0

這是不正確的或者至少非常不尋常的C語法。我不會依賴編譯器決定如何處理它。 – Tobia

+3

@Tobia僅僅因爲你從未見過它並不意味着C標準沒有明確定義它的含義。 –

回答

4

這將編譯得很好。但是你所做的是聲明的功能。這與在頂層添加(非原型)聲明相同。

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)();

+3

原型在哪裏? user2822466對C來說似乎是新的,所以他可能不知道爲什麼hey()永遠不會被調用。 – lucasg

1

你只是在那裏聲明函數,而不是調用它。

像這樣:

int main() 
{ 
    extern int hey(); // there is a function "hey" somewhere 

    hey(); 
} 
-1

int hey()方法不返回任何值。嘗試製作void hey()

+0

這是真的(http://stackoverflow.com/questions/10079089/implicit-int-return-value-of-c-function),但它與問題無關,因爲函數從未被調用過。 – Danstahr

相關問題