void main() {
int a(); // 這行代碼
}
這是一個函數聲明,聲明了一個名為 a、返回類型為 int、參數列表未指定(舊式 K&R 風格)的函數。不是變量定義!
int a(); → 聲明函數 a,返回 int() 在 C89/C90 中表示「參數未指定」,調用時不檢查參數個數/類型int a(void); 明確表示無參數聲明在 main() 內部 → 塊級作用域,僅在 main 函數內可見。這屬於內部聲明,合法但極不推薦。
編譯器只檢查語法合法性,不要求函數定義在同一文件。鏈接階段若找不到 a 的定義會報 undefined reference to 'a'。
| 代碼 | 含義 | 備註 |
|---|---|---|
int a(); | 函數聲明 | 返回 int 的函數 a |
int a = 0; | 變量定義+初始化 | 整型變量 a = 0 |
int a; | 變量聲明 | 未初始化,值不確定 |
int a(void); | 函數聲明(標準) | 明確無參數,C99 推薦 |
// utils.h\nint a(void);// utils.c\nint a(void) { return 42; }#include "utils.h"
/* K&R 風格(舊) */
int add(); // 聲明
int add(a, b) // 定義
int a, b;
{ return a + b; }
/* ANSI C 風格(現代) */
int add(int a, int b); // 聲明
int add(int a, int b) { return a + b; } // 定義
空參數表 () 是為兼容 K&R 代碼保留的特性,現代代碼嚴禁使用。
int a(); 在函數內部是合法的函數聲明,但語義極易混淆,實際開發中應移至頭文件並使用 int a(void); 標準寫法。若本意是定義變量,請寫 int a = 0; 或 int a;。