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)());
一种更简单的写法是使用 typedef
s:
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*
.
这需要一点时间来适应,但是一旦理解了原理,就很容易毫不含糊地阅读这些声明。
我对 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)());
一种更简单的写法是使用 typedef
s:
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*
.
这需要一点时间来适应,但是一旦理解了原理,就很容易毫不含糊地阅读这些声明。