fork download
  1. #include <stdio.h>
  2.  
  3. typedef struct
  4. {
  5. int a;
  6. int b;
  7. } MyStruct;
  8.  
  9. typedef struct
  10. {
  11. MyStruct s;
  12. int a;
  13. } OuterStruct;
  14.  
  15. #define MyStruct_Defaults(...) {.a = 42, .b = 37, __VA_ARGS__}
  16. #define MyStruct_ClDefaults(...) (MyStruct) MyStruct_Defaults(__VA_ARGS__)
  17.  
  18. #define OuterStruct_Defaults(...) {.s = MyStruct_Defaults(), .a = 99, __VA_ARGS__}
  19. #define OuterStruct_ClDefaults(...) (OuterStruct) OuterStruct_Defaults(__VA_ARGS__)
  20.  
  21. void print_v(MyStruct s);
  22. void print_p(MyStruct const * const s);
  23.  
  24. MyStruct gs = MyStruct_Defaults();
  25.  
  26. int main(void) {
  27. printf("gs.a: %d gs.b: %d\n", gs.a, gs.b);
  28.  
  29. MyStruct s1 = MyStruct_ClDefaults();
  30. printf("s1.a: %d s1.b: %d\n", s1.a, s1.b);
  31.  
  32. MyStruct s2 = MyStruct_ClDefaults(.a = 15, .b = 33);
  33. printf("s2.a: %d s2.b: %d\n", s2.a, s2.b);
  34.  
  35. OuterStruct S = OuterStruct_ClDefaults(.s = MyStruct_ClDefaults(.a = 16, .b = 29));
  36. printf(" S.a: %d S.b: %d\n", S.s.a, S.s.b);
  37.  
  38. print_v(MyStruct_ClDefaults(.b = 11));
  39. print_p(&MyStruct_ClDefaults(.a = 12));
  40.  
  41. return 0;
  42. }
  43.  
  44. void print_v(MyStruct s)
  45. {
  46. printf("vs.a: %d vs.b: %d\n", s.a, s.b);
  47. }
  48.  
  49. void print_p(MyStruct const * const s)
  50. {
  51. printf("ps.a: %d ps.b: %d\n", s->a, s->b);
  52. }
  53.  
Success #stdin #stdout 0s 2292KB
stdin
Standard input is empty
stdout
gs.a: 42    gs.b: 37
s1.a: 42    s1.b: 37
s2.a: 15    s2.b: 33
 S.a: 16     S.b: 29
vs.a: 42    vs.b: 11
ps.a: 12    ps.b: 37