// see http://stackoverflow.com/q/30603685/228539
// Note that this does not address the issue of later on knowing
// how long the array actually is so you can iterate over it.
// Also note the concerns raised about memory safety in the above
// StackOverflow answers and comments.
#include <stdio.h>
#include <stdint.h>
typedef struct T_Function T_Function;
typedef T_Function * T_Inhibits[];
struct T_Function
{
T_Inhibits * inhibitsTD; // pointer to array of pointers to this structure
T_Function * (* inhibits)[]; // pointer to array of pointers to this structure
};
#define T_Function_Default(...) \
{ \
.inhibitsTD = NULL, \
__VA_ARGS__ \
}
typedef struct
{
int i;
float f;
} T_Simple;
T_Simple * s = & (T_Simple) {.i = 42, .f = 3.14};
typedef int T_Array4[4];
T_Array4 * pa4 = & (T_Array4) {1,2,3,4};
typedef int * T_Array4p[4];
int one, two, three, four;
T_Array4p * pa4p = & (T_Array4p) {&one,&two,&three,&four};
int * (* not_typed)[4] = & (int *[]) {&one,&two,&three,&four};
int main(void) {
T_Function clutch = T_Function_Default();
T_Function start = T_Function_Default();
T_Function cruise = T_Function_Default();
T_Function radio = T_Function_Default();
// With an array variable to take the address of
T_Function a, b, c;
T_Function * ai[] = {&b, &c};
a.inhibitsTD = &ai;
b = a; // just to avoid unused errors
// Taking the address of the compound literal
T_Function x;
// direct
x.inhibitsTD = &(T_Function *[]) {&x};
x.inhibits = &(T_Function *[]) {&x};
// via typedef
x.inhibitsTD = &(T_Inhibits) {&x};
x.inhibits = &(T_Inhibits) {&x};
clutch.inhibitsTD = &(T_Inhibits) {&start};
start.inhibitsTD = &(T_Inhibits) {&radio, &cruise};
start = clutch; // just to avoid unused errors
clutch = start; // just to avoid unused errors
return 0;
}
Ly8gc2VlIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xLzMwNjAzNjg1LzIyODUzOQoKLy8gTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgYWRkcmVzcyB0aGUgaXNzdWUgb2YgbGF0ZXIgb24ga25vd2luZwovLyBob3cgbG9uZyB0aGUgYXJyYXkgYWN0dWFsbHkgaXMgc28geW91IGNhbiBpdGVyYXRlIG92ZXIgaXQuCgovLyBBbHNvIG5vdGUgdGhlIGNvbmNlcm5zIHJhaXNlZCBhYm91dCBtZW1vcnkgc2FmZXR5IGluIHRoZSBhYm92ZQovLyBTdGFja092ZXJmbG93IGFuc3dlcnMgYW5kIGNvbW1lbnRzLgoJCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGludC5oPgoKdHlwZWRlZiBzdHJ1Y3QgVF9GdW5jdGlvbiBUX0Z1bmN0aW9uOwp0eXBlZGVmIFRfRnVuY3Rpb24gKiBUX0luaGliaXRzW107CgpzdHJ1Y3QgVF9GdW5jdGlvbgp7CglUX0luaGliaXRzICogaW5oaWJpdHNURDsgLy8gcG9pbnRlciB0byBhcnJheSBvZiBwb2ludGVycyB0byB0aGlzIHN0cnVjdHVyZQogICAgVF9GdW5jdGlvbiAqICgqIGluaGliaXRzKVtdOyAvLyBwb2ludGVyIHRvIGFycmF5IG9mIHBvaW50ZXJzIHRvIHRoaXMgc3RydWN0dXJlCn07CgojZGVmaW5lIFRfRnVuY3Rpb25fRGVmYXVsdCguLi4pIFwKeyBcCgkuaW5oaWJpdHNURCA9IE5VTEwsIFwKCV9fVkFfQVJHU19fIFwKfQoKdHlwZWRlZiBzdHJ1Y3QKewoJaW50IGk7CglmbG9hdCBmOwp9IFRfU2ltcGxlOwoKVF9TaW1wbGUgKiBzID0gJiAoVF9TaW1wbGUpIHsuaSA9IDQyLCAuZiA9IDMuMTR9OwoKdHlwZWRlZiBpbnQgVF9BcnJheTRbNF07ClRfQXJyYXk0ICogcGE0ID0gJiAoVF9BcnJheTQpIHsxLDIsMyw0fTsKCnR5cGVkZWYgaW50ICogVF9BcnJheTRwWzRdOwppbnQgb25lLCB0d28sIHRocmVlLCBmb3VyOwpUX0FycmF5NHAgKiBwYTRwID0gJiAoVF9BcnJheTRwKSB7Jm9uZSwmdHdvLCZ0aHJlZSwmZm91cn07CmludCAqICgqIG5vdF90eXBlZClbNF0gPSAmIChpbnQgKltdKSB7Jm9uZSwmdHdvLCZ0aHJlZSwmZm91cn07CgppbnQgbWFpbih2b2lkKSB7CglUX0Z1bmN0aW9uIGNsdXRjaCA9IFRfRnVuY3Rpb25fRGVmYXVsdCgpOwoJVF9GdW5jdGlvbiBzdGFydCA9IFRfRnVuY3Rpb25fRGVmYXVsdCgpOwoJVF9GdW5jdGlvbiBjcnVpc2UgPSBUX0Z1bmN0aW9uX0RlZmF1bHQoKTsKCVRfRnVuY3Rpb24gcmFkaW8gPSBUX0Z1bmN0aW9uX0RlZmF1bHQoKTsKCi8vICBXaXRoIGFuIGFycmF5IHZhcmlhYmxlIHRvIHRha2UgdGhlIGFkZHJlc3Mgb2YKICAgIFRfRnVuY3Rpb24gYSwgYiwgYzsKICAgIFRfRnVuY3Rpb24gKiBhaVtdID0geyZiLCAmY307CiAgICBhLmluaGliaXRzVEQgPSAmYWk7CiAgICBiID0gYTsgLy8ganVzdCB0byBhdm9pZCB1bnVzZWQgZXJyb3JzCgovLyAgVGFraW5nIHRoZSBhZGRyZXNzIG9mIHRoZSBjb21wb3VuZCBsaXRlcmFsCglUX0Z1bmN0aW9uIHg7CgkvLyBkaXJlY3QKCXguaW5oaWJpdHNURCA9ICYoVF9GdW5jdGlvbiAqW10pIHsmeH07Cgl4LmluaGliaXRzID0gJihUX0Z1bmN0aW9uICpbXSkgeyZ4fTsKCS8vIHZpYSB0eXBlZGVmCgl4LmluaGliaXRzVEQgPSAmKFRfSW5oaWJpdHMpIHsmeH07Cgl4LmluaGliaXRzID0gJihUX0luaGliaXRzKSB7Jnh9OwoJCgljbHV0Y2guaW5oaWJpdHNURCA9ICYoVF9JbmhpYml0cykgeyZzdGFydH07CglzdGFydC5pbmhpYml0c1REID0gJihUX0luaGliaXRzKSB7JnJhZGlvLCAmY3J1aXNlfTsKCQoJc3RhcnQgPSBjbHV0Y2g7IC8vIGp1c3QgdG8gYXZvaWQgdW51c2VkIGVycm9ycwoJY2x1dGNoID0gc3RhcnQ7IC8vIGp1c3QgdG8gYXZvaWQgdW51c2VkIGVycm9ycwoJCglyZXR1cm4gMDsKfQo=