Importing empty C structs


(Rick M) #1

I'm trying to make a module out of a C library and header file. It has at least one empty struct:

struct lgs_context_t {};

and a function:

LGS_EXPORT struct lgs_context_t* lgs_init(const lgs_context_params_t* params);

Swift sees the function, I can call it and assign the result to a variable, but Xcode (as usual) fails to show me what it thinks the type is. So I can't declare a class member to hold the returned pointer.

I'm trying to declare the member like this:

    var ctx: lgs_context_t? // Use of undeclared type 'lgs_context_t'

I finally tried calling it like this:

    let ctx: UnsafeMutablePointer = lgs_init(...)

and the resulting error message gave me OpaquePointer. But couldn't it just typealias lgs_context_t to OpaquePointer?

Is there any way to do this in the modulemap?

Thanks!

···

--
Rick Mann
rmann@latencyzero.com


(Joe Groff) #2

The compiler uses OpaquePointer for pointers to incomplete types in C. It sounds like you left lgs_context_t declared but not defined in your header, in other words you wrote 'struct lgs_context_t;' without braces. If it were truly defined to be empty, then the type should have been imported.

-Joe

···

On Apr 17, 2017, at 6:19 PM, Rick Mann via swift-users <swift-users@swift.org> wrote:

I'm trying to make a module out of a C library and header file. It has at least one empty struct:

struct lgs_context_t {};

and a function:

LGS_EXPORT struct lgs_context_t* lgs_init(const lgs_context_params_t* params);

Swift sees the function, I can call it and assign the result to a variable, but Xcode (as usual) fails to show me what it thinks the type is. So I can't declare a class member to hold the returned pointer.

I'm trying to declare the member like this:

   var ctx: lgs_context_t? // Use of undeclared type 'lgs_context_t'

I finally tried calling it like this:

   let ctx: UnsafeMutablePointer = lgs_init(...)

and the resulting error message gave me OpaquePointer. But couldn't it just typealias lgs_context_t to OpaquePointer?

Is there any way to do this in the modulemap?

Thanks!


(Rick M) #3

It's defined with the braces (and nothing inside them).

···

On Apr 18, 2017, at 09:11 , Joe Groff <jgroff@apple.com> wrote:

On Apr 17, 2017, at 6:19 PM, Rick Mann via swift-users <swift-users@swift.org> wrote:

I'm trying to make a module out of a C library and header file. It has at least one empty struct:

struct lgs_context_t {};

and a function:

LGS_EXPORT struct lgs_context_t* lgs_init(const lgs_context_params_t* params);

Swift sees the function, I can call it and assign the result to a variable, but Xcode (as usual) fails to show me what it thinks the type is. So I can't declare a class member to hold the returned pointer.

I'm trying to declare the member like this:

  var ctx: lgs_context_t? // Use of undeclared type 'lgs_context_t'

I finally tried calling it like this:

  let ctx: UnsafeMutablePointer = lgs_init(...)

and the resulting error message gave me OpaquePointer. But couldn't it just typealias lgs_context_t to OpaquePointer?

Is there any way to do this in the modulemap?

Thanks!

The compiler uses OpaquePointer for pointers to incomplete types in C. It sounds like you left lgs_context_t declared but not defined in your header, in other words you wrote 'struct lgs_context_t;' without braces. If it were truly defined to be empty, then the type should have been imported.

--
Rick Mann
rmann@latencyzero.com