ImportC: Should this compile?

Mike Parker aldacron at gmail.com
Sun Dec 19 02:57:35 UTC 2021


On Saturday, 18 December 2021 at 22:31:38 UTC, bachmeier wrote:
> I've been trying to get the stb header library to compile. 
> There's a single remaining failure:
>
> ```
> typedef struct
> {
>    unsigned char c[4];
> } stb_easy_font_color;
> stb_easy_font_color c = { 255,255,255,255 }; // use structure 
> copying to avoid needing depending on memcpy()
> ```
>
> LDC returns
>
> ```
> stb_easy_font.c(892): Error: 3 extra initializer(s) for `struct 
> __tag21`
> ```
>
> Is this a bug in ImportC or is it correct that it doesn't 
> compile? What's the best way to fix it while keeping the same 
> behavior and performance?

Unless C11 has changed the rules about nested initializers, that 
should compile. You might try explicit nesting:

```d
stb_easy_font_color c = { {255,255,255,255} };
```

And please file an issue if there isn't one already.


> (I don't know what struct __tag21 is. It's not anywhere in the 
> source. Assuming that's just a bad error message.)

A "tag" is the name of a struct or union, which follows the 
keyword:

```c
struct Foo {};
```

Here, `Foo` is the tag. Instances of the struct must be declared 
as `struct Foo`. Think of it like this: `int` is required in 
declarations of instances of type `int`, so `struct` is required 
in declarations of type `struct`; the "tag" specifies which 
struct type, hence `struct Foo x`.

`typedef` introduces an alias:

```c
typedef struct Bar {} Bar;
```

So `Bar` is now an alias for `struct Bar`, and instances can be 
declared as `Bar x`.

Your example is like this:

```c
typedef struct {} stb_easy_font_color;
```

No tag is specified, so the compiler must generate one. In your 
case, it's `__tag21` and `stb_easy_font_color` is an alias for 
`struct __tag21`.

And yes, using the generated tag in the error message is not at 
all helpful without the alias. Please file an issue on this, too.


More information about the Digitalmars-d-learn mailing list