Técnicamente esto ni siquiera es válido C.
TrayMan era un poco en su análisis, sí 6.2.6.1 dice:
Except for bit-fields, objects are composed of contiguous sequences of one or more bytes, the number, order, and encoding of which are either explicitly specified or implementation-defined.
pero que atar con 6.2.5-20, que dice:
— A structure type describes a sequentially allocated nonempty set of member objects (and, in certain circumstances, an incomplete array), each of which has an optionally specified name and possibly distinct type.
y ahora se puede concluir que las estructuras van a tener uno o más bytes porque no pueden estar vacíos. Su código que está dando una advertencia, mientras que el mismo código en realidad dejar de compilar en Visual Studio de Microsoft con un error:
error C2016: C requires that a struct or union has at least one member
Así que la respuesta corta es no, no hay una manera portátil para evitar esta advertencia, porque te dice que estás violando los estándares de C. Tendrá que usar una extensión específica del compilador para suprimirlo.
¿Por qué necesita que el tamaño sea cero? –
Porque tengo una interfaz privada (en la que tengo mi estructura de tamaño cero porque no implemento una cierta funcionalidad) y una interfaz pública donde algunas de mis estructuras privadas se vuelven opacas y solo tienen que tener el mismo tamaño que las privadas. – claf
Mi sistema de compilación verifica el tamaño de la estructura privada y crea la estructura pública con un "char _opaque [SIZEOF_PRIVATE_STRUCT]". – claf