C bindings: typedef struct conflicts with method

Mike Parker via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Jul 22 18:57:25 PDT 2015


On Tuesday, 21 July 2015 at 05:53:26 UTC, yawniek wrote:
> i tried to automagically create bindings for librdkafka 
> (https://github.com/edenhill/librdkafka)
> with dstep.
>
> now the code contains typedefs structs with the same name as 
> methods:
>
> ```
> typedef struct rd_kafka_metadata {
>         int         broker_cnt;     /* Number of brokers in 
> 'brokers' */
>         struct rd_kafka_metadata_broker *brokers;  /* Brokers */
>
>         int         topic_cnt;      /* Number of topics in 
> 'topics' */
>         struct rd_kafka_metadata_topic *topics;    /* Topics */
>
>         int32_t     orig_broker_id; /* Broker originating this 
> metadata */
>         char       *orig_broker_name; /* Name of originating 
> broker */
> } rd_kafka_metadata_t;
>
>
> rd_kafka_metadata (rd_kafka_t *rk, int all_topics,
>                    rd_kafka_topic_t *only_rkt,
>                    const struct rd_kafka_metadata **metadatap,
>                    int timeout_ms);
> ```
>
> what the correct way to bind these?

Just FYI, the D side knows absolutely nothing about what the 
struct is called on the C side and vice versa. Only functions 
(and any global variables if you need them) are actually bound. 
Types are translated. So you can call the struct anything you 
want on the D side.

That said, it's usually a good idea to use the the same name as 
the C code uses for consistency. It means existing C code can be 
ported to D, or with custom libraries you can switch back and 
forth, without needing to remember that a struct is call bloob_t 
in C and Blarg in D.

In your case, rd_kafka_metadata is the name of the struct, but in 
C instances would need to be declared like so:

struct rd_kafka_metadata instance;

The typedef makes it so that instances can be declared in C 
without the struct keyword:

rd_kafka_metadata_t instance;

That makes the latter a better choice to use on the D side.




More information about the Digitalmars-d-learn mailing list