адрес члена напрямую
Обычный способ выглядит следующим образом:
struct myStruct *pnt = (struct myStruct*) dlsym(handle, "structure");
int *b = &pnt->b;
Теперь давайте подставим s/pnt/((struct myStruct*) dlsym(handle, "structure"))/
.То есть:
int *b = &((struct myStruct*) dlsym(handle, "structure"))->b;
без определения компилятором структуры?(из комментариев)
Это может быть немного сложно, но мы можем это сделать.Вам нужно будет экспортировать другой символ:
const size_t offsetof_member_b_in_myStruct = offset(struct myStruct, b);
А потом в коде клиента:
int *b = (int*)(
(uintptr_t)dlsym(handle, "structure") +
*(size_t*)dlsym(handle, "offsetof_member_b_in_myStruct")
);
Я думаю, что такой API может быть согласованным, но чувствует себя плохо.Проще экспортировать структуру в код клиента.Возможно, в общем случае лучше создать стандарт, определяющий структуру памяти структуры, которую вы обмениваете с клиентским кодом (таким образом, вы возлагаете на клиентов ответственность за обеспечение надлежащей абстракции).