读取函数指针语法

时间:2010-05-02 19:02:02

标签: c++ function-pointers

每当我看一个C函数指针时,我的眼睛都会茫然。我看不懂它们。

here开始,这里有两个函数指针TYPEDEFS的例子:

typedef int (*AddFunc)(int,int);
typedef void (*FunctionFunc)();

现在我习惯了这样的事情:

typedef vector<int> VectorOfInts ;

我读作

typedef vector<int> /* as */ VectorOfInts ;

但是我无法阅读上面的2个typedef。包围和星号放置,这是不合逻辑的。

为什么*旁边的单词AddFunc ..?

5 个答案:

答案 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:)