每当我看一个C函数指针时,我的眼睛都会茫然。我看不懂它们。
从here开始,这里有两个函数指针TYPEDEFS的例子:
typedef int (*AddFunc)(int,int);
typedef void (*FunctionFunc)();
现在我习惯了这样的事情:
typedef vector<int> VectorOfInts ;
我读作
typedef vector<int> /* as */ VectorOfInts ;
但是我无法阅读上面的2个typedef。包围和星号放置,这是不合逻辑的。
为什么*旁边的单词AddFunc ..?
答案 0 :(得分:5)
当您理解它时,只需忽略typedef
,函数名称周围的括号和名称前面的星号。然后你有int AddFunc(int,int);
。
(*functionName)
中括号的要点是专门将*
与typedef的名称分组。需要*
来表明这是一个函数指针。
所以任何将int
作为参数并且返回int
的{{1}}符合AddFunc
“接口”的函数,如果你愿意的话。同样,任何不接受参数的函数返回void都可以用于FunctionFunc
。
答案 1 :(得分:4)
第一个的实际类型是
int (*)(int,int);
(即指向一个函数的指针,该函数接受int
类型的两个参数并返回int
)
*
将其标识为函数指针。 AddFunc
是typedef的名称。
cdecl可以帮助识别特别复杂的类型或变量声明。
答案 2 :(得分:3)
我看了
typedef vector<int> /* as */ VectorOfInts ;
如果您将typedef
视为 对象定义且前面放置了typedef
,那可能会更好:
int i;
定义 整数对象
typedef int t;
定义整数类型 。
vector<int> v;
定义 矢量对象
typedef vector<int> v;
定义向量类型 。
int (*AddFunc)(int,int)
定义 函数指针
typedef int (*AddFunc)(int,int)
定义函数指针类型 。
C语言继承的C语句是一团糟。我同意typedef int (*)(int,int) AddFunc;
会更有意义。但C的声明语法已有40年历史,从未改变过,也永远不会改变。你最好习惯它。
答案 3 :(得分:2)
函数声明如下所示:
int AddFunc(int,int);
void FunctionFunc();
定义函数类型的typedef看起来是一样的,前面只有typedef
:
typedef int AddFunc_t(int,int);
typedef void FunctionFunc_t();
要定义指向这种函数类型的指针,需要额外的*
附加括号来指定*
所属的位置:
typedef int (*pAddFunc_t)(int,int);
typedef void (*pFunctionFunc_t)();
(*
始终位于被定义为指针的typename / variable之前。)
要读取此类函数指针,请按相反方向继续:省略类型名称周围的(* ... )
和前面的typedef
。结果看起来像是相关类型的正常函数声明。
答案 4 :(得分:0)
星号表示它是一个函数POINTER:)