klib icon indicating copy to clipboard operation
klib copied to clipboard

Kvec (others?), no struct tag

Open jvburnes opened this issue 5 years ago • 2 comments

Maybe there's an alternative way to do this that makes more sense, but when I'm using kvec the struct is anonymous. Maybe this works for C++, but it drives most C compilers crazy when you need to pass kvecs by value or reference to a subroutine since only C11 even knows about anonymous structs.

I solved this by: #define kvec(type) struct kv_##type##_s { size_t n, m; type *a; } #define kvec_t(type) struct kv_##type##_s Then put kvec(int); in your headers and kvec_t(int) in your variable definitions and parameter references.

jvburnes avatar May 27 '20 05:05 jvburnes

I have the same issue!

Unfortunately, the above solution won't work for composed types, e.g. unsigned int.

The only solution I found so far is to encapsulate the anonymous kvec struct inside another struct.

typedef struct uints {
     kvec_t(unsigned int);
} uints;

Then I can pass it around in functions as such

uints process_numbers(uints input)
{
      uints output = ...
      
      return output;
}

aganm avatar Mar 06 '21 04:03 aganm

@aganm not only will it not work for composed types, it will also not work for some compound literals, like :

struct { int x, y; } {1,2}
(int []){1,2,3}
(int){34}

since only C11 even knows about anonymous structs

~@jvburnes , isn't it a C99 feature ?~ My bad. It worked on -std=c99 so I assumed this. Very odd, given this comment :

The irony is that the semantics afforded by anonymous structs and unions were available in Dennis Ritchie's 1974 C compiler, and I think gcc had supported anonymous structs and unions in the days prior to the C89 Standard. Some people seem to think it's a new feature, but it merely represents a regained ability that should never have been lost.

a-p-jo avatar Nov 17 '21 00:11 a-p-jo