我在arm上使用了container_of的这个实现:
#define container_of(ptr, type, member) \
({ \
const typeof(((type *) NULL)->member) *__mptr = (ptr); \
(type *) (void*)((char *) __mptr - offsetof(type, member)); \
})
问题是,即使向此实现添加(void *)强制转换也不会删除-Wcast-align警告。我真的不想把它关掉,因为它在这个特定情况下失败了,实际上它确实没问题。 (问题是转换为char *然后键入*更改类型的对齐。之前使用的解决方案是首先转换为void *然后键入*作为告诉编译器它是故意的方式 - 但是这个解决方案在gcc版本4.8.3(OpenWrt / Linaro GCC 4.8-2014.04 r48666)上对我不起作用
有没有办法告诉编译器只允许这个演员?