C語言中文網 目錄

C語言函數聲明

在使用函數之前應該先聲明,事先通知編譯器該函數的類型:換句話說,一個聲明即是描述一個函數的接口。聲明至少應指明函數返回值的類型,如下例所示:
int rename();

這一行代碼聲明 rename()是一個函數,其返回值的類型是 int 類型。因為在默認情況下,函數名是外部可見的標識符,所以上述聲明等同于:
extern int rename();

該聲明沒有包含關于函數參數的數量和類型等相關信息。因此,編譯器無法檢查調用該函數時所傳入的參數是否正確。如果調用該函數時傳入的參數有別于該函數的定義,那么會導致嚴重的運行錯誤。

為了避免這樣的錯誤,應該在聲明函數時,同時聲明函數的參數。換句話說,所聲明的應該是一個函數原型(function prototype)。例如,標準庫函數 rename()(它用于修改文件名)的原型如下:
int rename( const char *oldname, const char *newname );

該函數需要兩個參數,類型都是指向 const char 的指針。換句話說,此函數使用這兩個指針的目的是為了讀取 char 對象,所以參數可以是字符串字面量。

在原型聲明中,參數的標識符是可選的,可以不寫。如果將參數名包含進去,這些名稱的作用域也僅限于該原型中。對于編譯器來說參數名是沒有意義的,它們最多和注釋一樣告訴程序員該參數的目的。

例如,在函數 rename()的原型中,參數名稱 oldname 和 newname 用來告訴程序員,在調用函數時,舊的文件名寫在前而,新的文件名寫在后面。對于編譯器來說,上述原型聲明等同于沒有給出參數名的聲明:
int rename( const char *, const char * );

標準頭文件中包含了標準庫函數的原型。如果想在程序中調用函數 rename(),可以通過在代碼中包含頭文件 stdio.h 的方式來達到聲明的效果。

通常,可以將自己所定義的函數原型放在一個頭文件中,這樣在其他任何源代碼文件中,通過 include 命令來包含該頭文件,則可以使用這些函數。

聲明可選參數

C 語言允許定義參數數量可變(variable number of argument)的函數。關于此類函數,最常見的例子是 printf(),它具有下面的原型:
int printf( const char *format, ... );

如同該例所展示的,這個參數類型列表的最后一個逗號后,跟著的是省略號(…)。省略號代表了可選參數。函數 printf()調用的第一個參數必須是 char 指針。這個參數后面可能會跟著其他參數。原型并沒有包含可選參數的數量或類型等相關信息。

聲明長度可變的數組參數

當聲明某個函數,其參數是長度可變數組(variable-length array),除了在函數定義的頭部,其他地方都可以使用星號(*)來表示數組長度。如果使用非常量的整數表達式來定義數組長度,編譯器會將它視為星號。例如,下面所有的聲明都可當作函數 maximum()的原型:
double maximum( int nrows, int ncols, double matrix[nrows][ncols] );
double maximum( int nrows, int ncols, double matrix[ ][ncols] );
double maximum( int nrows, int ncols, double matrix[*][*] );
double maximum( int nrows, int ncols, double matrix[ ][*] );

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo