對比 C# 編譯器自動掃描全文件,C 編譯器單遍掃描特性導致函數使用前必須聲明,否則觸發隱式聲明推斷錯誤。
// 錯誤代碼:函數定義在 main 之後
int main() {
fun1(); // 編譯器隱式假設:int fun1()
fun2();
return 0;
}
void fun1() { printf("msg1\n"); } // 實際返回 void
void fun2() { printf("msg2\n"); }
編譯錯誤:
conflicting types for 'fun1' previous implicit declaration of 'fun1' was here
int,參數不定void fun1(),類型衝突報錯
void fun1(void); // 原型聲明
void fun2(void);
int main() { ... }
void fun1() { ... }
void fun2() { ... }
void fun1() { ... }
void fun2() { ... }
int main() { ... }
// func.h
#ifndef FUNC_H
#define FUNC_H
void fun1(void);
void fun2(void);
#endif
// func.c
#include "func.h"
void fun1() { ... }
void fun2() { ... }
// main.c
#include "func.h"
int main() { ... }
| 特性 | C | C# |
|---|---|---|
| 編譯模式 | 單遍 | 多遍/元數據 |
| 前向引用 | 需聲明 | 自動解析 |
| 隱式聲明 | 有(危險) | 無 |
| 標準做法 | 頭文件聲明 | 命名空間/using |
#ifndefvoid func(int, char)-Wall -Wextra -Werror理解編譯器單遍特性,是避免 C 語言隱式聲明陷阱的關鍵。