#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

/* 這裡手動列舉所有成員 */
/* 第三個參數是給 printf 用的格式字串 */
#define STRUCTURE_MEMBER_LIST(F) \
F(int8_t, field1, PRId8) \
F(int16_t, field2, PRId16) \
F(int32_t, field3, PRId32)

/* 結構定義 */
#define DEFINE_STRUCT(type, name, pri) type name;

typedef struct {
	STRUCTURE_MEMBER_LIST(DEFINE_STRUCT)
} Data;

/* 處理參數 */
#define UPDATE_STRUCT(type, name, pri) \
	if(userSetting->name == oldDefault->name) \
		userSetting->name = newDefault->name;

void updateSetting(Data* oldDefault, Data* newDefault, Data* userSetting)
{
	STRUCTURE_MEMBER_LIST(UPDATE_STRUCT)
}

/* 列印 */
#define PRINT_STRUCT(type, name, pri) \
	printf(#name " = %" pri "\n", data->name);

void printSetting(Data* data)
{
	STRUCTURE_MEMBER_LIST(PRINT_STRUCT)
}

int main()
{
	Data oldDefault = {1, 5, 10};
	Data newDefault = {10, 50, 100};
	Data user = {8, 5, 0};
	
	printSetting(&user);
	updateSetting(&oldDefault, &newDefault, &user);
	printSetting(&user);
	return 0;
}
