- #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=