用戶截圖顯示定義函數指針數組時:
(*pf[3])() = ...{func1(), func2(), func3()} 而非函數名 {func1, func2, func3}。// 1. 類型別名法(最清晰)
typedef void (*FuncPtr)(); // 無參無返回
FuncPtr pf[3] = {func1, func2, func3};
// 2. 直接定義
void (*pf[3])() = {func1, func2, func3};
// 3. 使用 std::function (C++11 推薦)
#include <functional>
std::function<void()> pf[3] = {func1, func2, func3};
// 支持 lambda、bind、函數對象,更靈活
pf[0](); // 調用 func1
pf[1](); // 調用 func2
| 錯誤寫法 | 問題 | 修正 |
|---|---|---|
(*pf[3])() = {func1(), ...} | 左側多括號;右側調用函數而非取地址 | 去掉左括號;右側寫函數名 |
void *pf[3] = {&func1, ...} | 類型不匹配(void* 非函數指針) | 用正確函數指針類型 |
pf[0] = func1(); | 賦值為調用返回值 | pf[0] = func1; |
void (Class::*pf[3])() = {&Class::func1, ...},調用需對象:(obj.*pf[0])()。std::function + std::vector,類型擦除、支持捕獲上下文,避免原始指針陷阱。函數指針數組定義核心:**左側聲明指針類型,右側賦值函數名(不加括號)**。掌握 typedef 或 using 別名可大幅降低誤寫率。