Unnamed Structure and Union Fields - Anonymous Struct
검색해보니 대략 구조가 확정적이지 않을 때 사용할 수 있으나 좋은 방법은 아니라는 것 같다
union의 field 중 비구조체와 구조체를 같이 깔끔하게 넣을 수 있다
혹은 자료형을 확정적이지 않게 사용할 수 있다
c로 function overloading 도 가능하다 ㅎㅎ
struct sensors_poll_device_t {
struct hw_device_t common;
int (*activate)(struct sensors_poll_device_t *dev,
int sensor_handle, int enabled);
int (*setDelay)(struct sensors_poll_device_t *dev,
int sensor_handle, int64_t sampling_period_ns);
int (*poll)(struct sensors_poll_device_t *dev,
sensors_event_t* data, int count);
};
typedef struct sensors_poll_device_1 {
union {
struct sensors_poll_device_t v0;
struct {
struct hw_device_t common;
int (*activate)(struct sensors_poll_device_t *dev,
int sensor_handle, int enabled);
int (*setDelay)(struct sensors_poll_device_t *dev,
int sensor_handle, int64_t sampling_period_ns);
int (*poll)(struct sensors_poll_device_t *dev,
sensors_event_t* data, int count);
};
};
int (*batch)(struct sensors_poll_device_1* dev,
int sensor_handle, int flags, int64_t sampling_period_ns,
int64_t max_report_latency_ns);
int (*flush)(struct sensors_poll_device_1* dev, int sensor_handle);
int (*inject_sensor_data)(struct sensors_poll_device_1 *dev, const sensors_event_t *data);
void (*reserved_procs[7])(void);
} sensors_poll_device_1_t;
struct sensors_poll_context_t {
struct sensors_poll_device_t device;
sensors_poll_context_t();
~sensors_poll_context_t();
int activate(int handle, int enabled);
...
private:
...
};
정의는 이렇게 되어있고 실제 사용은 아래와 같다
static inline int sensors_open_1(const struct hw_module_t* module,
sensors_poll_device_1_t** device) {
return module->methods->open(module,
SENSORS_HARDWARE_POLL, (struct hw_device_t**)device);
}
static int open_sensors(const struct hw_module_t* module, const char* id,
struct hw_device_t** device)
{
sensors_poll_context_t *dev = new sensors_poll_context_t();
memset(&dev->device, 0, sizeof(sensors_poll_device_t));
*device = &dev->device.common;
...
}
sensors_poll_device_1_t 에서 struct hw_device_t 로 자유로이 형변환 하여 호출한다
overloading 하는 것 같은 느낌이 난다
왜냐하면 sensors_open_1 입장에서는 device 변수는 hw_device_t 로 활용하여 멤버 변수에 접근할 수 도 있고
아니면 그냥 sensors_poll_device_1 로 그대로 사용하여 batch나 flush 같은 애들을 호출할 수도 있다
https://gcc.gnu.org/onlinedocs/gcc/Unnamed-Fields.html