我试图从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
并没有真正得到任何地方。所以,如果这是一个愚蠢的行为,我会很高兴它被关闭。
谢谢,我试过cdecl.org声明,但不能让它给我以外的任何东西“语法错误”。我现在可以看到那是因为它不识别'sqlite3_vfs'。如果我只是用'int'替换'sqlite3_vfs',那么我会得到我的答案。 –
另一件让我想起来的事情是,尽管'sqlite3OsDlSym'返回“指向函数(void)返回void的指针”,实际返回的函数指针具有不同的原型,因此'(sqlite3_loadext_entry)'强制转换。 –
取决于'SQLITE_PRIVATE'实际是什么,它可能适用于被声明的函数而不是返回类型(例如,如果它是'static'的宏) –