ЯП: C99
Пытаюсь запилить shared library. Что имеется:
Файл lib.h (он же интерфейс):
typedef struct mystruct mystruct;
mystruct foo();
Файл lib.c (он же реализация):
#include "lib.h"
struct mystruct {
float float_val;
short short_val;
}
mystruct foo() {
mystruct = {.float_val = 1.1};
return mystruct;
}
Компилится нормально:
gcc -c lib.c -o lib.o -fPIC
gcc -shared -o lib.so lib.o
Проблема, естественно, состоит в том, что использовать хидер (он же интерфейс) практически невозможно, т.к. размера структуры мы не знаем, и, соответственно, юзер свою прогу с использованием либы скомпилить не сможет:
#include "lib.h"
int main() {
// ...
mystruct a = foo(); // вот тут плюнет "error: variable ‘a’ has initializer but incomplete type"
// затем "invalid use of incomplete typedef ‘mystruct’"
// а затем "storage size of ‘a’ isn’t known"
// ...
return 0;
}
Задача:
1) Юзер имеет только интерфейс. Использует только его и shared object.
2) Юзер не имеет доступа к полям структуры. Т.е. mystruct.float_val = 99.99; выполнить нельзя.
ЛОР, подскажи, пожалуйста.
Может внутрь хидера зашибенить какое-то говно типа
struct blablabla {
char[sizeof(needed_structure)];
};
UPD: Решение - opaque pointer. Возвращать структуру а не указатель на неё - моветон. Если так и делать, то лучше открыть структуру вместо велосипедирования.