static int secp256k1_pubkey_load(const secp256k1_context* ctx, secp256k1_ge* ge,
const secp256k1_pubkey* pubkey)
由于您只处理指向结构的指针,因此您只需要 typedef 和不完整的结构定义,您可以从定义它们的 .h 文件中获取它们,以便为编译器提供足够的声明上下文。这对于结构的 typedef 来说很容易,例如将这一行放在函数声明的上方:
typedef struct secp256k1_context_struct secp256k1_context;
进行相同的重新声明是安全的,因此无论有没有完整的标题都可以正常工作。
其他两种类型更成问题,因为它们是匿名结构的 typedef。我认为最好的方法是如果我们没有真实的声明,就给它一个虚假的声明,例如
#ifndef SECP256K1_H
typedef void secp256k1_pubkey;
#endif
#ifndef SECP256K1_GROUP_H
typedef void secp256k1_ge;
#endif
(您可以使用真正的 secp256k1_pubkey 定义,但 _ge 取决于可能变化的字段,我想有足够的上下文来选择正确的字段是您首先要避免的。)
尽管对库的更改,这有点脆弱,并且需要您在此文件之前包含 secp256k1 标头(如果有的话)。(否则你会得到编译器错误:在评论中记下你所做的事情,这样如果将来有人发现这个问题,他们就会知道如何修复它。)
然后,您可以在自己的标头中为函数定义提供足够的上下文。请注意,任何不只是从其他地方传递这些结构的调用代码无论如何都可能需要完整的结构定义:为什么不把这个函数声明放在一个新的 .h 中,无论如何都需要包含完整的头文件,只有一个几个具体的地方需要?