Правила C о том, что делает типы совместимыми, частично касаются «значения» типа, а не только того, насколько он велик, какие значения он представляет или как он их представляет. В этих правилах указатели на int
и long
являются разными и несовместимыми типами, даже если они используют одинаковое количество байтов и одинаково кодируют адреса и указывают на int
и long
, которые используют одинаковое количество байтов и кодировать числа таким же образом.
Стандарт C может разрешить реализацию C для определенных (typedef
) int32_t
и int64_t
значений int
, long
или long long
, в зависимости от ситуации. В этом случае соответствующие типы будут не только совместимыми, но и идентичными. Однако стандарт также позволяет определять их как расширенные типы, отличные от целочисленных типов c, даже если они функционируют одинаково. Как отмечает chqrl ie, ваша реализация C, вероятно, определяет int32_t
как int
и int64_t
как long long
, поэтому ни один из них не совместим с long
.
«Значение» типа включает в себя некоторые вещи о том, для чего люди планируют использовать тип и что это значит для компилятора. int
первоначально означало, что размер с целевым процессором в некотором смысле хороший, но со временем он ослаб. Два типа структуры могут быть определены с одинаковыми элементами, но один содержит координаты xy для двумерного графа, а другой содержит вещественно-мнимые части для комплексных чисел. Наличие этих отдельных и несовместимых типов помогает программистам избежать некоторых ошибок.
В целом код, такой как int32_t x; int *p = &x;
, был написан с ошибкой, и желательно указать на это предупреждение. И предупреждение не является помехой, так как легко написать код, который работает, как нужно, без получения предупреждения.