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

Is void *function() a pointer to function or a function returning a void*?

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

该函数具有 return 类型 void *

void *function();

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

void * function();

正如 Jarod42 在评论中指出的那样,您可以使用尾随 return 类型重写 C++ 中的函数声明,例如

auto function() -> void *;

如果你想声明一个指向函数的指针,那么你应该写

void ( *function )();

其中 return 类型是 void

void * ( *function )();

其中 return 类型 void *

或者指向函数的指针,return指向函数的指针

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

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

这样想你的声明:

void *(function());

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

void (*function2)();

这样想上面的声明:

void ((*function2)());

一种更简单的写法是使用 typedefs:

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

function_returning_void_pointer function;
function_returning_nothing *function2;

这通常消除了围绕函数指针的混淆并且更易于阅读。

每当我不确定 C 语法问题时,我喜欢使用 cdecl utility (online version) 来为我解释。它在 C 语法和英语之间进行转换。

比如我输入你的例子void *foo(),返回

declare foo as function returning pointer to void

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

void (*foo)()

当您在单个表达式中有多个级别的类型转换、星号或括号时,这会特别有用。

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

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

  • 从标识符开始:function

  • function() 一个没有参数的函数

  • void* function() 和 return 是 void*

这个一般原则也适用于数组声明([] 也比 * 具有更高的优先级)和两者的组合。所以

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

读作

  • arr
  • arr[42] 42 个元素的数组
  • *arr[42] 指向
  • (*arr[42])() 不带参数的函数和
  • int *(*arr[42])() return 一个 int*.

这需要一点时间来适应,但是一旦理解了原理,就很容易毫不含糊地阅读这些声明。