?
本文檔使用 php中文網(wǎng)手冊 發(fā)布
函數(shù)定義將函數(shù)體(聲明和語句序列)與函數(shù)名稱和參數(shù)列表關聯(lián)起來。與函數(shù)聲明不同,函數(shù)定義只允許在文件范圍內(沒有嵌套函數(shù))。
C支持兩種不同形式的函數(shù)定義:
specifiers-and-qualifiers parameter-list-declarator function-body | (1) | |
---|---|---|
specifiers-and-qualifiers identifier-list-declarator declaration-list function-body | (2) |
其中
符和限定符 | - | 類型說明符的組合,可能被聲明器修改,形成返回類型存儲類說明符,它確定標識符(靜態(tài),外部或無)與inline,noreturn或none |
---|---|---|
參數(shù)列表說明符 | - | 一個函數(shù)類型的聲明符,它使用參數(shù)列表來指定函數(shù)參數(shù) |
標識符列表說明符 | - | 一個函數(shù)類型的聲明符,它使用標識符列表來指定函數(shù)參數(shù) |
聲明列表 | - | 在identifier-list-declarator中聲明每個標識符的聲明序列。這些聲明不能使用初始化器,唯一允許的存儲類說明符是寄存器。 |
功能體 | - | 一個復合語句,它是一個括號括起來的聲明和語句序列,每當調用該函數(shù)時都會執(zhí)行 |
可能由聲明者修改的類型說明符構成返回類型
存儲類說明符,其中確定所述識別符的鍵(static
,extern
或無)
函數(shù)說明符inline,noreturn或none
parameter-list-declarator - a declarator for a function type which uses a [parameter list](function_declaration) to designate function parameters identifier-list-declarator - a declarator for a function type which uses a [identifier list](function_declaration) to designate function parameters declaration-list - sequence of declarations that declare every identifier in identifier-list-declarator. These declarations cannot use initializers and the only [storage-class specifier](storage_duration) allowed is `register`. function-body - a [compound statement](statements#Compound_statements), that is a brace-enclosed sequence of declarations and statements, that is executed whenever this function is called
1)新式(C89)功能定義。該定義既引入了函數(shù)本身,又作為未來函數(shù)調用表達式的函數(shù)原型,強制從參數(shù)表達式轉換為聲明的參數(shù)類型。
int max(int a, int b){ return a>b?a:b;} double g(void){ return 0.1;}
2)舊式(K&R)功能定義。這個定義不像原型,任何未來的函數(shù)調用表達式都會執(zhí)行默認參數(shù)促銷。
int max(a, b)int a, b;{ return a>b?a:b;}double g(){ return 0.1;}
與函數(shù)聲明一樣,函數(shù)的返回類型由聲明符中的類型說明符確定,并可能在聲明中像通常一樣由聲明器修改,這些類型必須是完整的非數(shù)組對象類型或類型void
。
void f(char *s) { puts(s); } // return type is voidint sum(int a, int b) { return a+b: } // return type is intint (*foo(const void *p))[3] { // return type is pointer to array of 3 int return malloc(sizeof(int[3]));}
和函數(shù)聲明一樣,參數(shù)的類型從函數(shù)調整到指針,從數(shù)組到指針,為了構造函數(shù)類型,它們的頂級限定符被去除。
與函數(shù)聲明不同,未命名的形式參數(shù)是不允許的,即使它們沒有在函數(shù)中使用,它們也必須被命名。唯一的例外是特殊參數(shù)列表(void)
。
int f(int, int); // declaration// int f(int, int) { return 7; } // Errorint f(int a, int b) { return 7; } // definitionint g(void) { return 8; } // OK, void doesn't declare a parameter
在函數(shù)體內,每個參數(shù)都是一個左值表達式,它們具有自動存儲持續(xù)時間和塊范圍。內存中的參數(shù)布局(或者如果它們存儲在內存中)未指定:它是調用約定的一部分。
int main(int ac, char **av){ ac = 2; // parameters are lvalues av = (char *[]){"abc", "def", NULL}; f(ac, av);}
有關函數(shù)調用機制的其他詳細信息,請參閱函數(shù)調用運算符,然后返回以從函數(shù)返回。
__func__在每個函數(shù)體中,可以使用具有塊范圍和靜態(tài)存儲持續(xù)時間的特殊預定義變量__func__,就像在緊跟在大括號之后定義的那樣。static const char __func __ [] =“function name”; 這個特殊的標識符有時與預定義的宏常量__FILE__和__LINE__結合使用,例如通過assert。 | (自C99以來) |
---|
參數(shù)列表必須明確地出現(xiàn)在聲明器中,它不能從 typedef 繼承。
typedef int p(int q, int r); // p is a function type int(int, int)p f { return q + r; } // Error
在C89中,說明符和限定符是可選的,如果省略,函數(shù)的返回類型默認為int(可能由聲明者修改)。另外,舊式定義不需要聲明列表中的每個參數(shù)。任何聲明缺失的參數(shù)都有int類型。max(a,b)// a和b的類型是int,返回類型是int {return a> b?a:b; } | (直到C99) |
---|
C11 standard (ISO/IEC 9899:2011):
6.9.1 Function definitions (p: 156-158)
C99 standard (ISO/IEC 9899:1999):
6.9.1 Function definitions (p: 141-143)
C89/C90 standard (ISO/IEC 9899:1990):
3.7.1 Function definitions