Udostępnij za pośrednictwem


Ostrzeżenie kompilatora (błąd) C4597

niezdefiniowane zachowanie: offsetof stosowane do elementu członkowskiego bazy wirtualnej

Użycie offsetof(T, m) metody where m odwołuje się do elementu członkowskiego danych statycznych lub funkcji składowej powoduje wystąpienie C4597.

Uwagi

To ostrzeżenie jest nowe w programie Visual Studio 2017 w wersji 15.3. Jest on domyślnie zgłaszany jako błąd. Aby uzyskać informacje na temat wyłączania ostrzeżeń według wersji kompilatora, zobacz Ostrzeżenia kompilatora według wersji kompilatora.

Przykład

Następujący kod generuje błąd C4597:

#include <cstddef>

struct A {
   int ten() { return 10; }
   static constexpr int two = 2;
};

constexpr auto off = offsetof(A, ten);  // C4597: undefined behavior: offsetof applied to member function 'A::ten'
constexpr auto off2 = offsetof(A, two); // C4597: undefined behavior: offsetof applied to static data member 'A::two'

Ten kod jest źle sformułowany i może potencjalnie spowodować awarię w czasie wykonywania. Aby rozwiązać ten problem, zmień kod: nie wywołujej funkcji offsetof składowych ani statycznych składowych danych. Jest to nieodnośny kod, który jest niedozwolony w standardzie C++.