Доступ к переменной C в Swift

Я пытаюсь получить доступ к переменной состояния, объявленной в файле .h, но компилятор сказал, что переменная не существует. Нужно ли мне что-то добавлять в мой заголовочный файл моста?

В моем быстром файле я не могу получить доступ к dstate или cstate

Компилятор говорит «Использование неразрешенного идентификатора« dstate »» в строке g722_coder_init(&dstate).

Ошибка компилятора

Файл заголовка

#ifdef __cplusplus
extern "C" {
#endif

extern struct g722_dstate dstate;
extern struct g722_cstate cstate;

int g722_coder_init (  struct g722_cstate *s  );
int g722_encode(short *data, unsigned char *outdata,int len, struct g722_cstate *s  );
int g722_decoder_init (  struct g722_dstate *s);
int  g722_decode(unsigned char *decdata, short *pcmout, int len,  struct g722_dstate *s );

#ifdef __cplusplus
}
#endif

Объединяющий заголовок

#import "g722_codec.h"

person Charles F    schedule 12.04.2017    source источник


Ответы (2)


Проблема в том, что struct g722_dstate является «неполным типом», и Swift не может импортировать переменные неполного типа, а только переменные, которые являются указателями на неполный тип (и они импортируются как OpaquePointer).

Добавление полного определения структуры в импортированный заголовочный файл было бы самым простым решением.

Если это невозможно, то одним из обходных путей было бы добавить

#import "g722_codec.h"

static struct g722_dstate * __nonnull dstatePtr = &dstate;

в заголовочный файл моста, который определяет переменную, содержащую адрес "непрозрачной" переменной dstate. Это импортируется в Swift как

var dstatePtr: OpaquePointer

и затем может быть использован, например. в качестве

g722_coder_init(dstatePtr)
person Martin R    schedule 12.04.2017

Вы можете создать функцию в файле c и добавить имя функции в качестве предварительного объявления в заголовке моста. Например:

//In c File you have definition & forward declaration
int g722_encode(short *data, unsigned char *outdata,int len, struct g722_cstate *s  );
int g722_encode(short *data, unsigned char *outdata,int len, struct g722_cstate *s  ){

}

Заголовок моста должен быть -

 #import "g722_codec.h"
int g722_encode(short *data, unsigned char *outdata,int len, struct g722_cstate *s  );
person Jack    schedule 12.04.2017