offsetof во время компиляции

Есть ли способ найти смещение члена структуры во время компиляции? Я хочу создать константу, содержащую смещение элемента структуры. В следующем коде макрос offsetof() работает в первом выражении printf . Однако использование в строке 10 для объявления генерирует ошибку:

«Невозможно разрешить» -> «оператор как постоянное выражение».

Есть ли другой способ сделать это?

 struct MyStruct { unsigned long lw; unsigned char c[5]; int i; int j; unsigned long last; }; const int ofs = offsetof(struct MyStruct, i); // This line in error int main(void) { printf("Offset of c = %d.\n", offsetof(struct MyStruct, c) ); printf("Offset of i = %d.\n", ofs ); return 0; } 

    Макрос offsetof () является конструкцией времени компиляции. Не существует стандартного способа его определения, но у каждого компилятора должен быть какой-то способ сделать это.

    Один из примеров:

     #define offsetof( type, member ) ( (size_t) &( ( (type *) 0 )->member ) ) 

    Несмотря на то, что технически не являться конструкцией времени компиляции (см. Комментарии пользователя «litb»), каждый компилятор должен иметь по крайней мере одно такое выражение, которое он может разрешить во время компиляции, и это именно то, что определено для offsetof() в < stddef.h>.

    Вероятно, есть некоторая другая ошибка для вашего кода – отсутствующий include или какая-то другая вещь, раздражающая ваш компилятор.

    Он компилируется без предупреждения здесь с g ++ 4, после добавления правильного #includes.

    Вы # включая stddef.h? offsetof () – макрос, а не встроенное ключевое слово в C.

    Если это не исправить, попробуйте сделать константу static, чтобы ограничить ее модулем. Это может сделать компилятор счастливым.

    Если у вас есть #include как я предполагаю (сообщение об ошибке, которое вы цитируете без него, было бы бессмысленным), это ошибка в вашем компиляторе. offsetof result – целочисленное постоянное выражение в C99, а также в C90.