在閱讀 libcurl 源碼時發現其函數指針定義方式與常見寫法不同,經分析發現兩種定義方式均合法。
常見寫法(帶指針符號):
typedef int (*pFunc)(int); // pFunc 是函數指針類型
libcurl 風格(無指針符號,直接定義函數類型):
typedef ssize_t (Curl_send)(struct connectdata *conn, int sockindex, const void *buf, size_t len, CURLcode *err); // 此時 Curl_send 是一個函數類型,而非指針類型 // 使用時需顯式加指針:Curl_send *send[2];
#include <iostream>
using namespace std;
int testFunc(int para) {
cout << "parameter is: " << para << endl;
return 0;
}
int main() {
// 方式 1:定義函數類型,再加指針
typedef int (pTestFunc)(int);
pTestFunc *pFunc = testFunc; // 初始化
pFunc(1111); // 調用
(*pFunc)(2222); // 解引用調用
pTestFunc *pFunc2 = &testFunc; // 取地址初始化
pFunc2(3333);
// 方式 2:傳統定義函數指針類型
typedef int (*pTestFunc2)(int);
pTestFunc2 pFunc3 = testFunc;
pFunc3(1111);
(*pFunc3)(2222);
pTestFunc2 pFunc4 = &testFunc;
pFunc4(3333);
return 0;
}