fork download
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <inttypes.h>
  4.  
  5. /* 這裡手動列舉所有成員 */
  6. /* 第三個參數是給 printf 用的格式字串 */
  7. #define STRUCTURE_MEMBER_LIST(F) \
  8. F(int8_t, field1, PRId8) \
  9. F(int16_t, field2, PRId16) \
  10. F(int32_t, field3, PRId32)
  11.  
  12. /* 結構定義 */
  13. #define DEFINE_STRUCT(type, name, pri) type name;
  14.  
  15. typedef struct {
  16. STRUCTURE_MEMBER_LIST(DEFINE_STRUCT)
  17. } Data;
  18.  
  19. /* 處理參數 */
  20. #define UPDATE_STRUCT(type, name, pri) \
  21. if(userSetting->name == oldDefault->name) \
  22. userSetting->name = newDefault->name;
  23.  
  24. void updateSetting(Data* oldDefault, Data* newDefault, Data* userSetting)
  25. {
  26. STRUCTURE_MEMBER_LIST(UPDATE_STRUCT)
  27. }
  28.  
  29. /* 列印 */
  30. #define PRINT_STRUCT(type, name, pri) \
  31. printf(#name " = %" pri "\n", data->name);
  32.  
  33. void printSetting(Data* data)
  34. {
  35. STRUCTURE_MEMBER_LIST(PRINT_STRUCT)
  36. }
  37.  
  38. int main()
  39. {
  40. Data oldDefault = {1, 5, 10};
  41. Data newDefault = {10, 50, 100};
  42. Data user = {8, 5, 0};
  43.  
  44. printSetting(&user);
  45. updateSetting(&oldDefault, &newDefault, &user);
  46. printSetting(&user);
  47. return 0;
  48. }
  49.  
Success #stdin #stdout 0s 5676KB
stdin
Standard input is empty
stdout
field1 = 8
field2 = 5
field3 = 0
field1 = 8
field2 = 50
field3 = 0