Боюсь, я уже знаю ответ на этот вопрос, но хочу убедиться ...
У меня довольно большой проект с файлом заголовка, который определяет собственные типы:
typedef unsigned long int u32;
typedef signed long int s32;
// etc...
Случилось неизбежное, и теперь я пытаюсь скомпилировать систему, в которой long
- это 64 бита вместо 32. Как лучше всего это исправить?
Я мог бы typedef
вышеуказанное с int
(или _5 _ / _ 6_ из stdint.h), который удовлетворял бы 32-битному размеру на платформах, о которых я знаю, но это все еще кажется сомнительным. Также существует проблема с функциями стиля printf
, где использовалось %ld
(компилятор жалуется и хотел бы вместо этого увидеть %d
). Все это нужно было бы изменить, не так ли (возможно, с определениями в inttypes.h)?
Это кажется простым, но я хотел бы убедиться, прежде чем начать копаться в этом (исправление строк формата printf
кажется сложной задачей).
unsigned int
? Это портативный, просто не предсказуемый размер. - person Kerrek SB   schedule 31.08.2011%ld
не-long
, а с флагом вы должны иметь возможность превратить это предупреждение в ошибку. Это дает вам возможность все исправить. - person Dietrich Epp   schedule 31.08.2011printf
. Однако компилятор не помогает, когда строка формата поступает откуда-то еще, например, из набора локализованных строк. Это одна из причин, по которой рекомендуется использовать только%s
в таких строках локализации и преобразовывать числа в строки перед включением кода, зависящего от языка, или использовать что-то более безопасное, чем varargs. Однако, если вы уже сделали это по-другому, нужно это изменить. Так что то, что вы говорите, стоит делать, но не все исправляет. - person Steve Jessop   schedule 31.08.2011