Tôi đang biên soạn một số C++ mã trong MinGW GCC 4.4.0, và nhận được lời cảnh báo với các hình thức sau đây ...Điều gì là sai với việc sử dụng offsetof này?
warning: invalid access to non-static data member '<membername>' of NULL object
warning: (perhaps the 'offsetof' macro was used incorrectly)
vấn đề này có vẻ quen thuộc - một cái gì đó tôi đã cố gắng để giải quyết trước và thất bại, tôi suy nghĩ, nhưng một lúc trước. Mã xây dựng tốt trong Visual C++, nhưng tôi đã không xây dựng mã đặc biệt này gần đây trong bất kỳ trình biên dịch khác.
Mã vấn đề là các mẫu sau đây ...
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) };
};
Rõ ràng tôi có lẽ có thể sử dụng một số tổng hợp có điều kiện để sử dụng chức năng biên dịch cụ thể cho điều này, và tôi tin rằng C++ 0x sẽ (sau cùng) làm cho nó thừa. Nhưng trong mọi trường hợp, tôi không thể nhìn thấy bất cứ điều gì sai trái với việc sử dụng này của offsetof
.
Rất vẻ thông thái, có thể là vì T
loại tham số đôi khi không POD, các lớp học để GCC c_Test
như phi POD và than phiền (và than phiền và phàn nàn - Tôi nhận được gần 800 dòng những cảnh báo này) .
Điều này là nghịch ngợm bởi các từ ngữ nghiêm ngặt của tiêu chuẩn, vì các loại không thuộc POD có thể vi phạm offsetof
. Tuy nhiên, loại hình không phải POD này không phải là vấn đề trong thực tế - c_Test
sẽ không có bảng ảo và không cần phải thực hiện thủ đoạn thời gian chạy để tìm bù đắp của m_Test
.
Bên cạnh đó, ngay cả khi c_Test
có bảng ảo, GCC triển khai macro offsetF bằng nội tại luôn được đánh giá tại thời gian biên dịch dựa trên bố cục tĩnh của loại cụ thể đó. Cung cấp một công cụ sau đó rên rỉ (xin lỗi, cảnh báo) mỗi khi nó được sử dụng chỉ có vẻ ngớ ngẩn.
Ngoài ra, tôi không phải là người duy nhất quanh đây ai làm loại điều ...
Answer to legit-uses-of-offsetof question
tôi làm nhớ mình có một vấn đề với offsetof
cho loại lý do, nhưng Tôi không nghĩ rằng sự cố là mẫu này.
Bất kỳ ý tưởng nào?
Bạn có thể thêm ví dụ cho các loại POD tái tạo sự cố không? –
@Georg - Không có vấn đề gì - tôi không nghĩ thẳng. Họ có các nhà thầu và do đó không phải là POD. Xem câu trả lời dưới đây. – Steve314