#include <stdio.h>
struct obj_s {
unsigned char a;
int b;
const char *c;
};
int checkByMode(struct obj_s *self, const char *message) {
return printf("%p: %s\n", self
, message
); }
#define OBJ_GETTER(member, type) \
type get_##member(struct obj_s *self) { \
int error_code = checkByMode(self, "common_get_"#member); \
return (error_code < 0) ? (type)error_code : self->member; \
}
OBJ_GETTER(a, unsigned char);
OBJ_GETTER(b, int);
OBJ_GETTER(c, const char *);
int main(void) {
struct obj_s obj = {
.a = 0xff,
.b = 5566,
.c = "Hello, world!"
};
printf("a:%x b:%d c:%s\n", get_a
(&obj
), get_b
(&obj
), get_c
(&obj
)); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgpzdHJ1Y3Qgb2JqX3MgewoJdW5zaWduZWQgY2hhciBhOwoJaW50IGI7Cgljb25zdCBjaGFyICpjOwp9OwoKaW50IGNoZWNrQnlNb2RlKHN0cnVjdCBvYmpfcyAqc2VsZiwgY29uc3QgY2hhciAqbWVzc2FnZSkgewoJcmV0dXJuIHByaW50ZigiJXA6ICVzXG4iLCBzZWxmLCBtZXNzYWdlKTsKfQoKI2RlZmluZSBPQkpfR0VUVEVSKG1lbWJlciwgdHlwZSkgXAoJdHlwZSBnZXRfIyNtZW1iZXIoc3RydWN0IG9ial9zICpzZWxmKSB7IFwKCQlpbnQgZXJyb3JfY29kZSA9IGNoZWNrQnlNb2RlKHNlbGYsICJjb21tb25fZ2V0XyIjbWVtYmVyKTsgXAoJCXJldHVybiAoZXJyb3JfY29kZSA8IDApID8gKHR5cGUpZXJyb3JfY29kZSA6IHNlbGYtPm1lbWJlcjsgXAoJfQoKT0JKX0dFVFRFUihhLCB1bnNpZ25lZCBjaGFyKTsKT0JKX0dFVFRFUihiLCBpbnQpOwpPQkpfR0VUVEVSKGMsIGNvbnN0IGNoYXIgKik7CgppbnQgbWFpbih2b2lkKSB7CglzdHJ1Y3Qgb2JqX3Mgb2JqID0gewoJCS5hID0gMHhmZiwKCQkuYiA9IDU1NjYsCgkJLmMgPSAiSGVsbG8sIHdvcmxkISIKCX07CglwcmludGYoImE6JXggYjolZCBjOiVzXG4iLCBnZXRfYSgmb2JqKSwgZ2V0X2IoJm9iaiksIGdldF9jKCZvYmopKTsKCXJldHVybiAwOwp9Cg==