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


26

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


5
@goodvibration C被设置为无格式(并且C ++继承了此格式)。甚至void*function();在语法上是正确的。例如,对于Python,他们选择了不同的决定-格式是语法的一部分。恕我直言,这两种方式各有利弊。
谢夫,

3
@goodvibration,您越会尝试保护程序员不要做他们想做的事情,您越会得到类似Java的东西;)
idclev 463035818 19-10-22

2
@goodvibration更少的选择,更少的灵活性。而且,请记住,这是几十年前的事了。之后很容易抱怨... ;-)
Scheff

2
在C语言中,void *function()是一个函数,它接受任意数量的参数并返回一个值,该值在取消引用后为void类型。在C ++中,void* function()是一个不带任何参数并返回指标指标的指针。您应该确定要询问哪种语言。
斯蒂芬·韦伯

1
@ StephenM.Webb void *不能取消引用a。毕竟,即使可以,您将如何处理void
法比奥说,请

Answers:


38

该函数具有返回类型void *

void *function();

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

void * function();

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

auto function() -> void *;

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

void ( *function )();

要么

void * ( *function )();

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

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

2
这就是为什么我更喜欢写void* function();。那不是那么诱人... ;-)(编辑是在撰写本文时发生的。)
Scheff

在代码我声明void * reader();然后上pthread_create(&thread1,null,reader,reader_arg)而不是pthread_create(&thread1,null,&reader,reader_arg)
user9515151

1
@Scheff:甚至auto function() -> void*(C ++)。:)
Jarod42

3
或指向函数的指针,该指针返回指向函数指针typedef就是... ;-)
Andrew Henle

1
@AndrewHenle使用typedef时,我们没有问题。当使用不带typedef或别名声明的声明时会出现问题。:)
Vlad,

7

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

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

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

为了查看其他语法,我输入declare foo as pointer to function returning void并返回

无效(* foo)()

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


2

这是一个返回的指针的函数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;

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


0

C / C ++中的声明是从标识符之后按照运算符优先级向外读取的。

快速浏览一下Wikipedia的C / C ++运算符优先级表,可以发现函数调用运算符()的优先级高于间接运算符*。因此,您的函数声明如下所示:

  • 从标识符开始:functionis

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

  • void* function()并返回void*

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

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

读为

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.