Что не так с этим использовать offsetof?

я компилирую некоторый код C++ в MinGW GCC 4.4.0 и получаю предупреждения со следующей формой...

warning: invalid access to non-static data member '<membername>'  of NULL object
warning: (perhaps the 'offsetof' macro was used incorrectly)

эта проблема кажется знакомой-то, что я пытался решить раньше и потерпел неудачу, я думаю, но некоторое время назад. Код отлично строится в Visual C++, но я не строил этот конкретный код в последнее время ни в одном другом компиляторе.

код проблемы следующий шаблон...

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) };
};

очевидно, я могу использовать некоторые условные компиляция для использования специфичных для компилятора функций для этого, и я считаю, что C++0x (наконец) сделает его избыточным. Но в любом случае, я не вижу ничего плохого в таком использовании offsetof.

очень педантично, это возможно, потому что T типы параметров иногда не являются POD, поэтому классы GCC c_Test как не-POD и жалуется (и жалуется и жалуется - Я получаю почти 800 строк этих предупреждений).

это непослушный строгая формулировка стандарта, так как не-POD типы могут сломаться offsetof. Однако этот вид не-стручка не должен быть проблемой на практике -c_Test не будет иметь виртуальной таблицы, и не требуется обмана во время выполнения, чтобы найти смещение m_Test.

кроме того, даже если c_Test имел виртуальную таблицу, GCC реализует макрос offsetof с использованием встроенного, который всегда оценивается во время компиляции на основе статического макета этого конкретного типа. Предоставление инструмента, а затем нытье (извините, предупреждение) каждый раз, когда он используется просто глупо.

кроме того, я не единственный человек здесь, кто делает такие вещи...

ответ на легит-использует-из-offsetof вопрос

я do помните, что проблема с offsetof по этой причине, но я не думаю проблема была в этом шаблоне.

какие идеи?

1 ответов


Упс...

вопрос is С c_Test структура не под силу Т типа не-Pod. Вот цитата из руководства GCC...

- Wno-invalid-offsetof (только для C++ и Objective-C++)

отключить предупреждения о применении макрос’ offsetof ' для типа non-POD.

согласно 1998 ISO C++ стандарт, применяющий ' смещение’ к тип non-POD не определен. В существующем С++ реализации, однако, 'offsetof' обычно дает смысл результаты даже при применении к определенным виды типов non-стручка. (Например, простая " структура’, которая не может быть POD тип только в силу наличия конструктор.) Этот флаг предназначен для пользователей которые знают, что они пишут nonportable код и кто имеет намеренно проигнорировать предупреждение об этом.

ограничения на 'offsetof' могут быть relaxed в будущей версии C++ норматив.

моя проблема в том, что почти все мои типы T имеют конструкторы и поэтому классифицируются как не-POD. Я проигнорировал этот момент как неуместный ранее - и, конечно, он должен быть неуместным для смещения в принципе. Проблема в том, что стандарт C++ использует классификацию one POD vs.non-POD, Хотя существует ряд различных способов быть не-POD, и компилятор правильно предупреждает о нестандартном использовании по умолчанию.

мой решением на данный момент будет опция выше, чтобы подавить предупреждение - теперь мне просто нужно выяснить, как сказать cmake использовать его.