static int secp256k1_pubkey_load(const secp256k1_context* ctx, secp256k1_ge* ge,
const secp256k1_pubkey* pubkey)
Поскольку вы имеете дело только с указателями на структуры, вам просто нужны определения типов и неполные определения структур, которые вы можете взять из файлов .h, где они определены, чтобы дать компилятору достаточно контекста для объявления. Это легко для тех, кто является typedefs структур, например, поместите эту строку над объявлением функции:
typedef struct secp256k1_context_struct secp256k1_context;
Безопасно сделать одинаковое переопределение, так что это будет нормально работать с полными заголовками или без них.
Другие два типа более проблематичны c, потому что они являются определениями типов анонимных структур. Я думаю, что лучший способ сделать это - создать поддельное объявление, если у нас его нет, например,
#ifndef SECP256K1_H
typedef void secp256k1_pubkey;
#endif
#ifndef SECP256K1_GROUP_H
typedef void secp256k1_ge;
#endif
(Вы можете использовать настоящее определение secp256k1_pubkey, но значение _ge зависит от поля, которые могут варьироваться, и я думаю, что наличие достаточного контекста для выбора правильных полей - это то, чего вы пытались избежать в первую очередь.)
Это немного по сравнению с agile, несмотря на изменения в библиотеке, и требует Вы включаете заголовки secp256k1 перед этим файлом, если они вообще есть. (В противном случае вы получите ошибки компилятора: запишите здесь в комментарии о том, что вы сделали, так что, если кто-то найдет это в будущем, он будет знать, как это исправить.)
Тогда у вас достаточно контекст для определения функции в вашем собственном заголовке. Обратите внимание, что любой вызывающий код, который не просто пропускает эти структуры откуда-то еще, вероятно, все равно будет нуждаться в полных определениях структуры: почему бы просто не поместить это объявление функции в новый .h, который в любом случае требует включения полных заголовков, что только нужно указать несколько c мест?