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;
Безопасно сделать идентичное повторное объявление, так что это будет нормально работать как с полными заголовками, так и без них.
Два других типа более проблематичны, потому что они являются определениями типов анонимных структур. Я думаю, что лучший способ сделать это - дать ему поддельную декларацию, если у нас нет настоящей, например.
#ifndef SECP256K1_H
typedef void secp256k1_pubkey;
#endif
#ifndef SECP256K1_GROUP_H
typedef void secp256k1_ge;
#endif
(Вы можете использовать реальное определение secp256k1_pubkey, но определение _ge зависит от полей, которые могут различаться, и я думаю, что наличие достаточного контекста для выбора правильных полей — это то, чего вы пытались избежать в первую очередь.)
Это немного хрупко, хотя и против изменений в библиотеке, и требует, чтобы вы включили заголовки secp256k1 перед этим файлом, если вообще. (В противном случае вы получите ошибки компилятора: сделайте пометку здесь в комментарии о том, что вы сделали, чтобы, если кто-то обнаружит это в будущем, они знали, как это исправить.)
Тогда у вас будет достаточно контекста для определения функции в вашем собственном заголовке. Обратите внимание, что любой вызывающий код, который не просто передает эти структуры откуда-то еще, вероятно, в любом случае потребует полных определений структур: почему бы просто не поместить объявление этой функции в новый .h, который в любом случае требует включения полных заголовков, что только мало конкретных мест нужно?
person
Rup
schedule
10.01.2020