#c
#c
Вопрос:
Есть ли хороший способ модифицировать класс в C таким образом, чтобы его целые числа были 64-разрядными в 64-разрядной системе и 32-разрядными для 32-разрядных систем? Есть ли способ проверить это?
Класс представляет собой что-то вроде:
class B{
public:
int64_t size();
private:
int64_t m_size();
}
Комментарии:
1. Почему вы считаете, что это желательно?
2. Здесь уместны предопределенные макросы компилятора и заголовочные файлы .
3. Я согласен с Игнасио здесь, почти всегда лучше использовать типы фиксированного размера, тогда вы будете подвержены меньшему количеству ошибок (например, сериализации …)
Ответ №1:
Если вы действительно хотите именно то, что вы сказали (32-разрядный на 32-разрядном и 64-разрядный на 64-разрядном), вам нужно будет использовать макросы.
Но вместо этого вы, вероятно, хотите просто использовать size_t
.
Редактировать:
size_t
гарантированно будет достаточно большим для определения размера любого объекта и индексирования любого массива. И как таковой, он обычно 32-разрядный для 32-разрядных и 64-разрядный для 64-разрядных. Так что, вероятно, это делает именно то, что вы хотите.
Комментарии:
1. В OP никогда не указывалось signed или unsigned. Но, основываясь на способе его использования, я собираюсь предположить, что unsigned подходит.
2. или просто
long
который равен 32 битам на x86 и 64 битам на x86-64 сgcc
. Или, возможно, некоторые из «быстрых» типов в<stdint.h>
?3. @Basile Starynkevitch: Однако это не поддерживается в Windows.
long
всегда 32-разрядный в Windows — даже на x64.4. @Nim, там тоже есть
ssize_t
.5. @SimonRichter:
ptrdiff_t
является стандартным типом со знаком для смещения указателя.ssize_t
является типом Posix и обычно означает «размер или код ошибки», а не смещение со знаком.
Ответ №2:
Существует intptr_t
, который может быть использован в гнусных целях, которые вы, вероятно, имеете в виду.
Ответ №3:
Вы могли бы использовать long int
. AFAIK long int
совпадает с int
(4-байтовым целым числом) в 32-разрядных компиляторах и совпадает с long long int
(8-байтовым целым числом) в 64-разрядных компиляторах. Вы можете проверить это с помощью sizeof
.