#include
main() {
int a=4, b=3, c, d;
f(a, b, &c, &d); // ← 此處呼叫 f,編譯器隱式假設 f 返回 int、參數預設提升
printf("%d\n", c+d);
}
void f(int x, int y, int *cp, int *dp) { // ← 實際定義:void 返回、指標參數
*cp = x + y;
*dp = x - y;
}
錯誤:`error C2371: 'f': 重定義;不同的基類型`
#include
// 1. 前向宣告 (在 main 之前)
void f(int x, int y, int *cp, int *dp);
int main() { // 建議標準寫法 int main()
int a=4, b=3, c, d;
f(a, b, &c, &d); // 編譯器已知 f 完整簽名,正確傳遞參數
printf("%d\n", c+d);
return 0;
}
// 2. 定義在後 (順序無所謂,只要有宣告)
void f(int x, int y, int *cp, int *dp) {
*cp = x + y;
*dp = x - y;
}
// 定義在 main 之前
void f(int x, int y, int *cp, int *dp) { ... }
main() {
f(a, b, &c, &d); // 編譯器已見完整定義,直接使用,無隱式宣告衝突
}
**本質相同**:編譯器在呼叫點前已知完整函數簽名。**標準做法是「前向宣告 + 定義分離」**,而非依賴定義順序。
// f.h
#ifndef F_H
#define F_H
void f(int x, int y, int *cp, int *dp);
#endif
// f.c
#include "f.h"
void f(int x, int y, int *cp, int *dp) { ... }
// main.c
#include
#include "f.h"
int main() { f(1,2,&c,&d); ... }
`error C2371` = **呼叫點前無函數宣告,導致隱式 `int f()` 與實際定義衝突**。
解決:**在所有呼叫前提供前向宣告 (函數原型)**,或將定義移至呼叫前。**標準工程做法:`.h` 宣告、`.c` 實作、編譯單元 `#include .h`**。