Các dòng sau (tinh khiết c) biên dịch sạch trên cửa sổ (win7 64 bit + CodeBlocks 13 + mingw32) và debian (khò khè 32 bit + CodeBlocks 10 + gcc) nhưng tăng cảnh báo về kali (64 bit + codeblocks + gcc). Có ý kiến gì không? Tôi có nghĩa là, tại sao tôi nhận được cảnh báo này, mặc dù cùng một dòng biên dịch w/o bất kỳ cảnh báo trên windows & debian?Tại sao tôi nhận được lỗi "truyền từ con trỏ đến số nguyên có kích thước khác"?
void* foo(void *dst, ...) {
// some code
unsigned int blkLen = sizeof(int); // this line ok.
unsigned int offset = (unsigned int) dst % blkLen; // warning here!
// some code cont...
}
Thông điệp trong CodeBlocks là: "lỗi: cast từ con trỏ đến số nguyên kích thước khác nhau [-Werror = con trỏ-to-int-cast]"
lưu ý: tùy chọn trình biên dịch của tôi là -std=c99 -Werror -save-temps
(tương tự trên cả ba hệ thống).
chỉnh sửa 2: Mặc dù tôi đã quản lý để biên soạn cảnh báo bằng cách sử dụng các dòng tiền xử lý bên dưới, @Keith Thompson (xem bên dưới) có một điểm quan trọng về vấn đề này. Vì vậy, quyết định cuối cùng của tôi là sử dụng uintptr_t
sẽ là một lựa chọn tốt hơn.
chỉnh sửa 1: Cảm ơn mọi người đã trả lời. Như tất cả các lưu ý trả lời, vấn đề là một vấn đề 32 bit vs 64 bit. Tôi đã chèn dòng tiền xử lý sau đây:
#if __linux__ // or #if __GNUC__
#if __x86_64__ || __ppc64__
#define ENVIRONMENT64
#else
#define ENVIRONMENT32
#endif
#else
#if _WIN32
#define ENVIRONMENT32
#else
#define ENVIRONMENT64
#endif
#endif // __linux__
#ifdef ENVIRONMENT64
#define MAX_BLOCK_SIZE unsigned long long int
#else
#define MAX_BLOCK_SIZE unsigned long int
#endif // ENVIRONMENT64
và sau đó thay thế dòng vấn đề như:
unsigned int offset = (MAX_BLOCK_SIZE) dst % blkLen;
Bây giờ, tất cả mọi thứ có vẻ OK.
trên một số hệ thống/biên dịch, kích thước của một int là khác biệt so với kích thước của một con trỏ. Tuy nhiên, đối với một hệ thống điển hình, giá trị bù trừ sẽ là 0 ... 3. do đó, một chút đúc kết quả của modulo để unsigned int sẽ khắc phục vấn đề. – user3629249