首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解释这个似乎是函数声明但不符合通常模式的声明?

如何解释这个似乎是函数声明但不符合通常模式的声明?
EN

Stack Overflow用户
提问于 2017-08-15 21:02:24
回答 2查看 264关注 0票数 8

我正试图从sqlite3.c中破译这个声明

代码语言:javascript
复制
SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *, void *, const char *))(void);

它似乎是在声明一个函数,因为随后会出现以下情况

代码语言:javascript
复制
SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *pVfs, void *pHdle, const char *zSym))(void){
  return pVfs->xDlSym(pVfs, pHdle, zSym);
}

然后是对函数的调用

代码语言:javascript
复制
xInit = (sqlite3_loadext_entry)sqlite3OsDlSym(pVfs, handle, zEntry);

代码语言:javascript
复制
xInit = (sqlite3_loadext_entry)sqlite3OsDlSym(pVfs, handle, zEntry);

但我无法理解这份声明。我强调了我无法理解的东西

代码语言:javascript
复制
SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *, void *, const char *))(void);
                    ^                                                    ^^^^^^^

我想知道为什么声明不是这样的

代码语言:javascript
复制
SQLITE_PRIVATE void *sqlite3OsDlSym(sqlite3_vfs *, void *, const char *);

我希望有一个类似的问题可能已经问过了,但是搜索像()void这样的术语并没有什么结果。所以,如果这是一个骗局,我会很高兴它被这样关闭。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-15 21:03:53

这是声明一个返回函数指针的函数。返回类型是void (*)(void) (SQLITE_PRIVATE扩展为static,不是每个注释的返回类型的一部分),但是函数名(和参数)必须出现在(*)部件中。

函数和数组是两个C类型的类别,需要做体操来解析。您可以将数组类型和函数类型视为“修饰”它们描述的标识符。如果编写int foo,则表示符号"foo“具有整数类型。如果编写int foo(double),则表示符号foo(double)具有整数类型。foo(double)必须结合在一起,因此任何进一步的装饰都必须将整个事物包装成一个单一的名称。

这一点最好通过混合数组类型和函数类型来说明,尽管结束类型在C中可能是不合法的(这说明了语法是多么荒谬)。例如:

代码语言:javascript
复制
int foo[5](double)

将是一个函数数组(foo[5]) (int ... (double))。另一方面:

代码语言:javascript
复制
int foo(double)[5]

是一个函数(foo(double))并返回一个数组(int ... [5])。

外部资源cdecl.org可以帮助您理解这种声明。但是,为了理解您的声明,您需要用标准类型替换结构名称(或者将结构类型写为struct sqlite_vfs,而不仅仅是sqlite_vfs)。

票数 8
EN

Stack Overflow用户

发布于 2017-08-15 21:32:50

本声明

代码语言:javascript
复制
SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *, void *, const char *))(void);

是函数的声明,该函数的返回类型是该类型的函数指针。

代码语言:javascript
复制
void ( * )( void )

该声明可以通过引入ty胡枝子来简化。例如

代码语言:javascript
复制
typedef void ( *FP )( void );

SQLITE_PRIVATE  FP sqlite3OsDlSym(sqlite3_vfs *, void *, const char *);

下面是一个演示程序,它使用一个类似的函数,返回指向另一个函数的指针。

代码语言:javascript
复制
#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;
}

其输出是

代码语言:javascript
复制
Hello World

首先,函数f是使用ty胡枝子f声明的,然后不使用ty胡枝子f。

代码语言:javascript
复制
FP f( void );
void ( *f( void) )( void )
{
    return h;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45701496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档