首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C 語言函數調用常見錯誤:缺少括號導致函數指標誤用

     編輯:C 語言問答

錯誤程式碼分析

#include <stdio.h>

void chuan_a(void);
void chuan_b(void);

int main() {
    printf("Smile!\n");
    chuan_a; // 錯誤:這裡是函數指標表達式,而非調用
    chuan_b; // 錯誤:同理
    return 0;
}

void chuan_a(void) { printf("Smile!Smile!\n"); }
void chuan_b(void) { printf("Smile!Smile!Smile!\n"); }

錯誤本質

在 C 語言中,函數名代表函數的入口地址 (函數指標)。

  • chuan_a:類型為 void (*)(void) 的右值,值為函數位址。單獨寫在語句中,屬於「無副作用的表達式語句」,編譯器通常只給警告 (如 statement with no effect),不會執行函數體。
  • chuan_a():函數調用運算子() 告訴編譯器「跳轉到該位址執行代碼,並傳遞參數」。

修正程式碼

int main() {
    printf("Smile!\n");
    chuan_a(); // 加上括號 () 即為調用
    chuan_b(); // 加上括號 ()
    return 0;
}

延伸知識:函數指標的正確用法

既然函數名是位址,我們可以將其賦值給函數指標變數,實現回調、多態、狀態機等進階模式。

typedef void (*FuncPtr)(void); // 定義函數指標類型

void execute(FuncPtr f) {
    if (f) f(); // 透過指標調用
}

int main() {
    execute(chuan_a); // 傳遞函數位址,無需括號
    execute(chuan_b);
    return 0;
}

編譯器警告等級建議

開啟高警告等級可捕獲此類低級錯誤:

  • GCC/Clang: -Wall -Wextra -Werror (將警告視為錯誤)
  • MSVC: /W4 /WX

編譯上述錯誤碼時,GCC 會提示:warning: statement with no effect [-Wunused-value]。

總結

函數調用必須加括號 (),即使參數列表為空 (void)。缺少括號僅獲取函數位址,不會執行任何代碼。養成閱讀編譯器警告的習慣,能省去無數除錯時間。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved