#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;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRpbnQuaD4KI2luY2x1ZGUgPGludHR5cGVzLmg+CgovKiDpgJnoo6HmiYvli5XliJfoiInmiYDmnInmiJDlk6EgKi8KLyog56ys5LiJ5YCL5Y+D5pW45piv57WmIHByaW50ZiDnlKjnmoTmoLzlvI/lrZfkuLIgKi8KI2RlZmluZSBTVFJVQ1RVUkVfTUVNQkVSX0xJU1QoRikgXApGKGludDhfdCwgZmllbGQxLCBQUklkOCkgXApGKGludDE2X3QsIGZpZWxkMiwgUFJJZDE2KSBcCkYoaW50MzJfdCwgZmllbGQzLCBQUklkMzIpCgovKiDntZDmp4vlrprnvqkgKi8KI2RlZmluZSBERUZJTkVfU1RSVUNUKHR5cGUsIG5hbWUsIHByaSkgdHlwZSBuYW1lOwoKdHlwZWRlZiBzdHJ1Y3QgewoJU1RSVUNUVVJFX01FTUJFUl9MSVNUKERFRklORV9TVFJVQ1QpCn0gRGF0YTsKCi8qIOiZleeQhuWPg+aVuCAqLwojZGVmaW5lIFVQREFURV9TVFJVQ1QodHlwZSwgbmFtZSwgcHJpKSBcCglpZih1c2VyU2V0dGluZy0+bmFtZSA9PSBvbGREZWZhdWx0LT5uYW1lKSBcCgkJdXNlclNldHRpbmctPm5hbWUgPSBuZXdEZWZhdWx0LT5uYW1lOwoKdm9pZCB1cGRhdGVTZXR0aW5nKERhdGEqIG9sZERlZmF1bHQsIERhdGEqIG5ld0RlZmF1bHQsIERhdGEqIHVzZXJTZXR0aW5nKQp7CglTVFJVQ1RVUkVfTUVNQkVSX0xJU1QoVVBEQVRFX1NUUlVDVCkKfQoKLyog5YiX5Y2wICovCiNkZWZpbmUgUFJJTlRfU1RSVUNUKHR5cGUsIG5hbWUsIHByaSkgXAoJcHJpbnRmKCNuYW1lICIgPSAlIiBwcmkgIlxuIiwgZGF0YS0+bmFtZSk7Cgp2b2lkIHByaW50U2V0dGluZyhEYXRhKiBkYXRhKQp7CglTVFJVQ1RVUkVfTUVNQkVSX0xJU1QoUFJJTlRfU1RSVUNUKQp9CgppbnQgbWFpbigpCnsKCURhdGEgb2xkRGVmYXVsdCA9IHsxLCA1LCAxMH07CglEYXRhIG5ld0RlZmF1bHQgPSB7MTAsIDUwLCAxMDB9OwoJRGF0YSB1c2VyID0gezgsIDUsIDB9OwoJCglwcmludFNldHRpbmcoJnVzZXIpOwoJdXBkYXRlU2V0dGluZygmb2xkRGVmYXVsdCwgJm5ld0RlZmF1bHQsICZ1c2VyKTsKCXByaW50U2V0dGluZygmdXNlcik7CglyZXR1cm4gMDsKfQo=