Следующая строка (чистая c) компилируется чисто на windows (win7 64 бит + кодовые блоки 13 + mingw32) и debian (wheezy 32 bits + codeblocks 10 + gcc), но вызывает предупреждение о kali (64 бита + кодовые блоки + gcc). Любые комментарии? Я имею в виду, почему я получаю это предупреждение, хотя одна и та же строка компилируется без предупреждения на windows и debian?
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...
}
Сообщение в кодовых блоках: " ошибка:, отличная от указателя до целого разного размера [-Werror = pointer-to-int-cast]"
note: мои параметры компилятора -std=c99 -Werror -save-temps
(одинаковые для всех трех систем).
изменить 2:
Хотя мне удалось скомпилировать его без предупреждения, используя строки препроцессора ниже,
@Keith Thompson (см. Ниже) имеет решающее значение в этой проблеме. Итак, последнее решение - использовать uintptr_t
- лучший выбор.
изменить 1: Спасибо, что все ответили. Как отмечают все ответы, проблема состоит в 32-разрядной версии 64-разрядной версии. Я вставил следующие строки препроцессора:
#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
а затем заменил проблемную строку следующим образом:
unsigned int offset = (MAX_BLOCK_SIZE) dst % blkLen;
Теперь все кажется ОК.