Dav*_*nan 9 c declaration function function-declaration
我试图从sqlite3.c中解读这个声明
SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *, void *, const char *))(void);
Run Code Online (Sandbox Code Playgroud)
似乎它正在声明一个函数,因为随后会有这个
SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *pVfs, void *pHdle, const char *zSym))(void){
return pVfs->xDlSym(pVfs, pHdle, zSym);
}
Run Code Online (Sandbox Code Playgroud)
然后似乎是对函数的调用
xInit = (sqlite3_loadext_entry)sqlite3OsDlSym(pVfs, handle, zEntry);
Run Code Online (Sandbox Code Playgroud)
和
xInit = (sqlite3_loadext_entry)sqlite3OsDlSym(pVfs, handle, zEntry);
Run Code Online (Sandbox Code Playgroud)
但我无法理解宣言.我突出了我无法理解的东西
SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *, void *, const char *))(void);
^ ^^^^^^^
Run Code Online (Sandbox Code Playgroud)
我想知道为什么宣言不是这样的
SQLITE_PRIVATE void *sqlite3OsDlSym(sqlite3_vfs *, void *, const char *);
Run Code Online (Sandbox Code Playgroud)
我希望可能有一个类似的问题已经被问到,但是搜索类似的术语(,)并void没有真正得到任何结果.所以,如果这是一个骗局,我会很高兴它被关闭.
这是声明一个返回函数指针的函数.返回类型是void (*)(void)(SQLITE_PRIVATE扩展为static并且不是返回类型的一部分,每个注释),但函数名称(和参数)必须出现在(*)部件内.
函数和数组是需要进行体操解析的两个C类型类别.您可以将数组类型和函数类型视为"装饰"它们描述的标识符.如果你写int foo,你说的是符号"foo"有一个整数类型.如果你写int foo(double),你说这个符号foo(double)有一个整数类型.foo并且(double)必须粘在一起,所以任何进一步的装饰必须包裹整个东西,好像它是一个单一的名称.
通过混合数组类型和函数类型可以很好地说明这一点,即使结束类型在C语言中可能不合法.(这说明语法有多荒谬.)例如:
int foo[5](double)
Run Code Online (Sandbox Code Playgroud)
将是foo[5]函数(int ... (double))的数组().另一方面:
int foo(double)[5]
Run Code Online (Sandbox Code Playgroud)
是一个function(foo(double))并返回一个数组(int ... [5]).
外部资源cdecl.org可以帮助您理解这种声明.但是,您需要使用标准类型(或编写结构类型struct sqlite_vfs而不是仅仅sqlite_vfs)替换结构名称,以便了解您的声明.