void * function()是指向函数的指针还是返回void *的函数?

时间:2019-10-22 09:10:33

标签: c++ c pointers function-pointers declaration

我对void *function()的含义感到困惑。
它是指向函数的指针还是返回void*的函数?我一直在数据结构上使用它作为返回指针的递归函数,但是当我在多线程(pthread)中看到代码时,会有一个相同的函数声明。现在我很困惑他们之间有什么区别。

4 个答案:

答案 0 :(得分:38)

该函数的返回类型为void *

void *function();

因此,在这种情况下,我总是更喜欢将符号*与函数名称分开,例如

void * function();

正如Jarod42在注释中所指出的,您可以使用尾随返回类型(如p

)来重写C ++中的函数声明。
auto function() -> void *;

如果要声明函数指针,则应编写

void ( *function )();

void * ( *function )();

或指向函数的指针,该指针将返回指向函数的指针

void * ( *( *function )() )();

答案 1 :(得分:7)

每当不确定C语法问题时,我都喜欢使用cdecl实用程序(online version)为我解释。它在C语法和英语之间进行翻译。

例如,我输入了您的void *foo()示例并返回了

  

将foo声明为函数,返回指向void的指针

要查看其他语法是什么样,我输入declare foo as pointer to function returning void并返回

  

void(* foo)()

当您在一个表达式中具有多个级别的类型转换,星号或方括号时,此功能特别有用。

答案 2 :(得分:2)

这是一个返回指向void的指针的函数。

这样想您的声明:

void *(function());

这将是一个返回void(或不返回)的函数:

void (*function2)();

这样想上面的声明:

void ((*function2)());

一种简单的编写方法是使用typedef s:

typedef void *function_returning_void_pointer();
typedef void function_returning_nothing();

function_returning_void_pointer function;
function_returning_nothing *function2;

这通常消除了函数指针周围的困惑,并且更易于阅读。

答案 3 :(得分:0)

在C / C ++中的声明从遵循运算符优先级的标识符向外读取。

快速浏览the C/C++ operator precedence table in wikipedia可以发现函数调用运算符()的优先级高于间接调用运算符*的优先级。因此,您的函数声明如下:

  • 从标识符function开始

  • function()一个不带参数的函数

  • void* function()并返回void*

此通用原则也适用于数组声明([]的优先级也高于*)和两者的组合。所以

int *(*arr[42])();

读取为

  • arr
  • arr[42]由42个元素组成的数组
  • *arr[42]指向
  • 的指针
  • (*arr[42])()函数不带参数,并且
  • int *(*arr[42])()返回一个int*

要花一点时间来习惯这一点,但是一旦您了解了原理,就可以很容易地明确地读取这些声明。