我对的含义感到困惑void *function()
。
它是指向函数的指针还是返回的函数void*
?我一直在数据结构上使用它作为返回指针的递归函数,但是当我在多线程(pthread
)中看到代码时,会有一个相同的函数声明。现在我很困惑他们之间有什么区别。
void *function()
是一个函数,它接受任意数量的参数并返回一个值,该值在取消引用后为void类型。在C ++中,void* function()
是一个不带任何参数并返回指标指标的指针。您应该确定要询问哪种语言。
我对的含义感到困惑void *function()
。
它是指向函数的指针还是返回的函数void*
?我一直在数据结构上使用它作为返回指针的递归函数,但是当我在多线程(pthread
)中看到代码时,会有一个相同的函数声明。现在我很困惑他们之间有什么区别。
void *function()
是一个函数,它接受任意数量的参数并返回一个值,该值在取消引用后为void类型。在C ++中,void* function()
是一个不带任何参数并返回指标指标的指针。您应该确定要询问哪种语言。
Answers:
该函数具有返回类型void *
。
void *function();
因此,我总是喜欢在这种情况下将符号*
与函数名称分开,例如
void * function();
正如Jarod42
注释中所 指出的,您可以使用尾随返回类型(如
auto function() -> void *;
如果要声明指向函数的指针,则应编写
void ( *function )();
要么
void * ( *function )();
或指向函数的指针,该指针返回指向函数的指针
void * ( *( *function )() )();
void* function();
。那不是那么诱人... ;-)(编辑是在撰写本文时发生的。)
void * reader();
然后上pthread_create(&thread1,null,reader,reader_arg)
而不是pthread_create(&thread1,null,&reader,reader_arg)
auto function() -> void*
(C ++)。:)
typedef
就是... ;-)
这是一个返回的指针的函数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;
通常,这消除了函数指针周围的混乱,并且更易于阅读。
C / C ++中的声明是从标识符之后按照运算符优先级向外读取的。
快速浏览一下Wikipedia中的C / C ++运算符优先级表,可以发现函数调用运算符()
的优先级高于间接运算符*
。因此,您的函数声明如下所示:
从标识符开始:function
is
function()
一个不带参数的函数
void* function()
并返回void*
。
此一般原则也适用于数组声明([]
优先级还高于*
)和二者的组合。所以
int *(*arr[42])();
读为
arr
是arr[42]
由42个元素组成的数组*arr[42]
指向(*arr[42])()
不带参数的函数int *(*arr[42])()
返回int*
。这需要一点时间来习惯,但是一旦您理解了原理,就可以很容易地清晰地阅读这些声明。
void*function();
在语法上是正确的。例如,对于Python,他们选择了不同的决定-格式是语法的一部分。恕我直言,这两种方式各有利弊。