在使用 Microsoft Visual Studio 編譯 C 語言程式碼時,遇到以下錯誤:
error C2601: 'work5_1' : local function definitions are illegal
錯誤發生的程式碼片段如下:
int work5_1 (int weekday, int totality)
{
int daycount;
for(int blank=1; blank <= weekday; blank++) printf(" ");
for(daycount=1; daycount <= totality; daycount++) {
if(weekday > 6) {
printf(" %d \n");
weekday = 0;
} else {
printf(" %d ", daycount);
weekday++;
}
}
return weekday;
}
這是一個經典的 C 語言語法錯誤。錯誤訊息 local function definitions are illegal 直譯為「局部函數定義是非法的」。
在 C 標準(C89/C90 以及後續版本)中,**不允許在一個函數內部定義另一個函數**(即巢狀函數)。上述程式碼極大概率是因為 work5_1 這個函數被誤放在了另一個函數(如 main)的大括號 { } 內部。
此外,程式碼中 for(int blank=1; ...) 這種在 for 迴圈初始化區宣告變數的寫法,屬於 C99 標準或 C++ 特有的語法。早期的 C 編譯器(如 MSVC 6.0 或較舊版本)若未開啟 C99 支援,也會報錯,但主要阻礙編譯的核心原因仍是函數巢狀定義。
work5_1 函數定義在所有函數的外部,與 main 函數平級。main)的右大括號 } 已經正確閉合,沒有遺漏或多餘的左大括號 { 導致後續函數被「包」在內部。int blank 的宣告移至函數開頭的區塊中。#include <stdio.h>
// 函數原型宣告
int work5_1(int weekday, int totality);
int main(void) {
// 主程式邏輯
// ...
return 0;
}
// 函數定義移至全域範圍,與 main 平級
int work5_1(int weekday, int totality) {
int daycount;
int blank; // 若不支援 C99,宣告移至此處
for(blank = 1; blank <= weekday; blank++) printf(" ");
for(daycount = 1; daycount <= totality; daycount++) {
if(weekday > 6) {
printf(" %d \n");
weekday = 0;
} else {
printf(" %d ", daycount);
weekday++;
}
}
return weekday;
}
C 語言不支援巢狀函數。遇到 error C2601 時,請優先檢查大括號是否匹配,確保所有函數定義都在全域範圍內。這是初學者從 C++ 轉向 C 或剛接觸 C 語言時最常犯的結構性錯誤之一。