Closed
Description
I am trying to call #sizeof
on a struct not created with typedef
(which is surprisingly common, e.g., sockaddr_rc
from the BlueZ library). Here is a simple example:
// struct.h
#ifndef WTF_H
#define WTF_H
struct foo {
int x;
int y;
int z;
};
#endif
-- Struct.chs
{-# LANGUAGE ForeignFunctionInterface #-}
module Struct where
#include "struct.h"
fooSize :: Int
fooSize = {#sizeof foo #}
Running c2hs Struct.chs
will fail with the error message:
c2hs: Errors during expansion of binding hooks:
Struct.chs:8: (column 20) [ERROR] >>> Unknown identifier!
Cannot find a definition for `foo' in the header file.
A simple workaround is to manually typedef
it elsewhere (e.g., typedef struct foo foo_t
). However, it doesn't feel like this should be necessary, since c2hs
has no problem recognizing non-typedef
'd structs elsewhere. For example, c2hs
preprocesses this with no problem:
{-# LANGUAGE EmptyDataDecls, ForeignFunctionInterface #-}
module Struct where
#include "struct.h"
import Foreign.C.Types
import Foreign.Ptr
import Foreign.Storable
data Foo
{#pointer *foo as FooPtr -> Foo #}
fooMutate :: FooPtr -> CInt -> IO ()
fooMutate = {#set foo.x #}