Estoy compilando algunos código C++ en MinGW GCC 4.4.0, y obtener advertencias con la siguiente forma ...¿Qué hay de malo con este uso de offsetof?
warning: invalid access to non-static data member '<membername>' of NULL object
warning: (perhaps the 'offsetof' macro was used incorrectly)
Este problema parece familiar - algo que he intentado resolver antes y fracasaba, piensa, pero hace un tiempo. El código se compila bien en Visual C++, pero no he construido este código en particular recientemente en ningún otro compilador.
El código de problema es el siguiente plantilla ...
template<typename T>
class c_Align_Of
{
private:
struct c_Test
{
char m_Char;
T m_Test;
};
public:
enum { e_Align = offsetof (c_Test, m_Test) };
};
Obviamente es probable que pueda utilizar algunos compilación condicional para utilizar las funciones específicas del compilador para esto, y creo que C++ 0x voluntad (por fin) hacerlo redundante. Pero en cualquier caso, no puedo ver nada malo con este uso de offsetof
.
Muy pedante, es posible que debido a que los T
tipos de parámetros son a veces no POD, las clases de manera CCG c_Test
como no-POD y se queja (y se queja y se queja - que estoy recibiendo cerca de 800 líneas de estas advertencias) .
Esto es travieso por la terminología estricta de la norma, ya que los tipos que no son POD pueden romper offsetof
. Sin embargo, este tipo de no POD no debería ser un problema en la práctica: c_Test
no tendrá una tabla virtual, y no se necesita engaño en tiempo de ejecución para encontrar el desplazamiento de m_Test
.
Además, incluso si c_Test
tiene una tabla virtual, GCC implementa la macro offsetde usando una intrínseca que siempre se evalúa en tiempo de compilación en función del diseño estático de ese tipo particular. Proporcionar una herramienta, luego lloriquear (lo siento, advertir) cada vez que se usa, parece tonto.
Además, yo no soy la única persona por aquí que hace este tipo de cosas ...
Answer to legit-uses-of-offsetof question
que hacen recuerdo haber tenido un problema con offsetof
para este tipo de razón, pero Yo no piensa el problema era esta plantilla.
¿Alguna idea?
¿Puede agregar un ejemplo para los tipos de POD que reproducen el problema? –
@Georg - No tiene sentido - No estaba pensando en serio. Tenían constructores y, por lo tanto, no eran POD. Ver la respuesta a continuación. – Steve314