我正试图从sqlite3.c中破译这个声明
SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *, void *, const char *))(void);它似乎是在声明一个函数,因为随后会出现以下情况
SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *pVfs, void *pHdle, const char *zSym))(void){
return pVfs->xDlSym(pVfs, pHdle, zSym);
}然后是对函数的调用
xInit = (sqlite3_loadext_entry)sqlite3OsDlSym(pVfs, handle, zEntry);和
xInit = (sqlite3_loadext_entry)sqlite3OsDlSym(pVfs, handle, zEntry);但我无法理解这份声明。我强调了我无法理解的东西
SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *, void *, const char *))(void);
^ ^^^^^^^我想知道为什么声明不是这样的
SQLITE_PRIVATE void *sqlite3OsDlSym(sqlite3_vfs *, void *, const char *);我希望有一个类似的问题可能已经问过了,但是搜索像(、)和void这样的术语并没有什么结果。所以,如果这是一个骗局,我会很高兴它被这样关闭。
发布于 2017-08-15 21:03:53
这是声明一个返回函数指针的函数。返回类型是void (*)(void) (SQLITE_PRIVATE扩展为static,不是每个注释的返回类型的一部分),但是函数名(和参数)必须出现在(*)部件中。
函数和数组是两个C类型的类别,需要做体操来解析。您可以将数组类型和函数类型视为“修饰”它们描述的标识符。如果编写int foo,则表示符号"foo“具有整数类型。如果编写int foo(double),则表示符号foo(double)具有整数类型。foo和(double)必须结合在一起,因此任何进一步的装饰都必须将整个事物包装成一个单一的名称。
这一点最好通过混合数组类型和函数类型来说明,尽管结束类型在C中可能是不合法的(这说明了语法是多么荒谬)。例如:
int foo[5](double)将是一个函数数组(foo[5]) (int ... (double))。另一方面:
int foo(double)[5]是一个函数(foo(double))并返回一个数组(int ... [5])。
外部资源cdecl.org可以帮助您理解这种声明。但是,为了理解您的声明,您需要用标准类型替换结构名称(或者将结构类型写为struct sqlite_vfs,而不仅仅是sqlite_vfs)。
发布于 2017-08-15 21:32:50
本声明
SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *, void *, const char *))(void);是函数的声明,该函数的返回类型是该类型的函数指针。
void ( * )( void )该声明可以通过引入ty胡枝子来简化。例如
typedef void ( *FP )( void );
SQLITE_PRIVATE FP sqlite3OsDlSym(sqlite3_vfs *, void *, const char *);下面是一个演示程序,它使用一个类似的函数,返回指向另一个函数的指针。
#include <stdio.h>
typedef void ( *FP )( void );
void h( void )
{
puts( "Hello World" );
}
FP f( void );
void ( *f( void) )( void )
{
return h;
}
int main(void)
{
f()();
return 0;
}其输出是
Hello World首先,函数f是使用ty胡枝子f声明的,然后不使用ty胡枝子f。
FP f( void );
void ( *f( void) )( void )
{
return h;
}https://stackoverflow.com/questions/45701496
复制相似问题