我对void *function()
的含义感到困惑。
它是指向函数的指针还是返回void*
的函数?我一直在数据结构上使用它作为返回指针的递归函数,但是当我在多线程(pthread
)中看到代码时,会有一个相同的函数声明。现在我很困惑他们之间有什么区别。
答案 0 :(得分:38)
该函数的返回类型为void *
。
void *function();
因此,在这种情况下,我总是更喜欢将符号*
与函数名称分开,例如
void * function();
正如Jarod42
在注释中所指出的,您可以使用尾随返回类型(如p
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*
。要花一点时间来习惯这一点,但是一旦您了解了原理,就可以很容易地明确地读取这些声明。