#include <iostream>

// from header 1
#pragma pack(push)
#pragma pack(1)
struct my_internal_buisiless {
	int cool_story;
	char magic;
	int another_cool_story;
};
#pragma pack(pop)

// from header 2
#pragma pack(push)
#pragma pack(2)
struct not_your_buisiness {
	char magic[2];
	float flop;
};
#pragma pack(pop)

// from header 3
struct widget {
	int blahblah;
	struct my_internal_buisiless business[4];
	struct not_your_buisiness nope[4];
};


struct struct1 {
	int element0;
	struct {
		int element0;
		char element1;
		int element2;
	} element1[4];
	struct {
		char element0[2];
		float element1;
	} element2[4];
};

int main(int argc, char* argv[])
{
	std::cout << "widget size: " << sizeof(widget)
		<< "\nmetaprog shit size: " << sizeof(struct1) << "\n";
}