Я экспериментировал с некоторым кодом C ~ 2005 года (я думаю, используя OpenSSL 0.9.8) и пытался make-инг его с OpenSSL 3.0.2 на Ubuntu 22.04.
Минимальный пример:
#include <openssl/bn.h>
struct fraction
{
BIGNUM numerator;
BIGNUM denominator;
}
Ожидаемый: все строится, как задумано.
Факт: компилятор жалуется на неполное объявление типа для обоих полей.
Почему это происходит? Разве это не действительное заявление? Или что-то еще?
Спасибо за ваши ответы! Я попробую изменить его, чтобы использовать указатели.
В будущем, пожалуйста, предоставьте полные неотредактированные сообщения об ошибках, как вы их видите, или первые несколько строк, если их слишком много.





Более поздние версии OpenSSL сделали несколько типов непрозрачными, в том числе BIGNUM, что означает, что вы не можете создавать их экземпляры непосредственно в пользовательском коде. В частности, тип BIGNUM стал непрозрачным, начиная с версии 1.1.0.
Вместо этого вам нужно будет использовать указатели:
struct fraction
{
BIGNUM *numerator;
BIGNUM *denominator;
};
И используйте соответствующие функции для их создания и уничтожения, а также используйте соответствующие функции доступа для доступа к членам.
BIGNUM, вероятно, является непрозрачным типом, который в C обычно реализуется с использованием чего-то вродеstruct bignumбез фактического определения того, что находится вstruct bignumспособом, доступным для вызывающих. В этом случаеBIGNUM, вероятно, являетсяtypedefпохожимstruct, который не виден. (У меня сейчас нет времени, чтобы на самом деле изучить определение OpenSSL 3 дляBIGNUM, чтобы увидеть, является ли это фактическим ответом, поэтому этот комментарий)