Что не так с этим использовать 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 использовать его.