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

C++ void*function()是指向函数的指针还是返回void*的函数?,c++,c,pointers,function-pointers,declaration,C++,C,Pointers,Function Pointers,Declaration,我对void*function()的含义感到困惑 它是指向函数的指针还是返回void*的函数?我一直在数据结构上使用它作为返回指针的递归函数,但是当我在多线程(pthread)中看到一个代码时,有一个相同的函数声明。现在我不知道它们之间有什么区别。函数的返回类型为void* void *function(); 因此,在这种情况下,我总是倾向于将符号*与函数名分开,如 void * function(); 和As>代码> JAROD42/指向注释中,可以使用尾随返回类型(如)重写C++中的函数

我对
void*function()
的含义感到困惑

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

函数的返回类型为
void*

void *function();
因此,在这种情况下,我总是倾向于将符号
*
与函数名分开,如

void * function();
<>和As>代码> JAROD42/<代码>指向注释中,可以使用尾随返回类型(如

)重写C++中的函数声明
auto function() -> void *;
如果您想要声明一个指向函数的指针,那么您应该编写

void ( *function )();
其中返回类型为
void

void * ( *function )();
其中返回类型
void*

或返回函数指针的函数指针

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

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

请这样思考您的声明:

void *(function());
void ((*function2)());
这将是一个返回
void
(或不返回任何内容)的函数:

可以这样想上述声明:

void *(function());
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语法和英语之间转换

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

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

为了查看其他语法是什么样子,我输入
将foo声明为指向返回void的函数的指针,它返回

无效(*foo)()


当在一个表达式中有多个级别的类型转换、星形或方括号时,这一点特别有用。

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

快速查看会发现函数调用运算符
()
的优先级高于间接运算符
*
。因此,函数声明如下所示:

  • 从标识符开始:
    函数

  • function()
    不带参数的函数

  • void*函数()
    并返回一个
    void*

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

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

  • arr
    is
  • arr[42]
    由42个元素组成的数组,这些元素是
  • *arr[42]
    指向
  • (*arr[42])()
    不带参数和
  • int*(*arr[42])()
    返回一个
    int*

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

这就是为什么,我更喜欢编写
void*function()。那没那么诱人…;-)(编辑是在写这篇文章的时候发生的。)在代码中,我声明
void*reader()
然后在
pthread\u-create(&thread1,null,reader,reader\u-arg)
而不是
pthread\u-create(&thread1,null,&reader,reader,reader\u-arg)
@Scheff:甚至
auto-function()->void*
(C++):)或者一个指向函数的指针,返回指向函数的指针,
typedef
用于…;-)@Andrewwhenle和typedef在一起没问题。当声明不使用Type或别名声明时会出现问题。))GooStestC+C使格式免费(C++)继承了“this”。偶数
void*函数()在语法上是正确的。例如,对于Python,他们选择了不同的决策-格式是语法的一部分。嗯,这两种方法都有其优点和缺点。@goodstring你越是试图保护程序员不做他们想做的事情,你得到的东西就越多,比如java;)@良好的振动少选择,灵活性少。请记住,他们这么做是几十年前的事了。事后很容易抱怨…;-)在C语言中,
void*function()
是一个函数,它接受任意数量的参数,并返回一个值,当取消引用时,该值的类型为void。C++中,<代码> VATUL*FUNCTION()/CUT>是一个不带参数的函数,返回空值的指针值。你应该决定要问哪种语言。@StephenM.Webb。毕竟,即使你可以,你会怎么处理
无效的