Получение указателя на 4-байтовый объект .. независимым от реализации способом - PullRequest
1 голос
/ 21 февраля 2010

Я программировал нормально, когда понял, что, вероятно, не совсем безопасно предполагать, что int будет указателем на что-то длиной 4 байта.

Потому что Некоторые аспекты фундаментальных типов C ++, такие как размер int, определяются реализацией ..

Что если вы имеете дело с чем-то (например, с осциллограммой), имеющим 32-битные целочисленные сэмплы со знаком. Вы приводите байтовый указатель к (int *) и обрабатываете его по одному образцу за раз.

Мне просто любопытно, каков "безопасный способ" получения 4-байтового указателя, который НЕ перестанет работать, если когда-нибудь в будущем комитет MSVC решит, что int теперь равно 8 байтов.

Относящиеся

Ответы [ 5 ]

7 голосов
/ 21 февраля 2010

Существует заголовок C99 с именем stdint.h, который может иметь ваш компилятор. Он определяет типы, такие как uint32_t, 32-разрядное целое число без знака.

Начиная с C ++ 11, ваш компилятор должен иметь этот заголовок. Вы должны включить его с #include <cstdint>.

Если нет, проверьте Boost Integer , который имитирует этот заголовок как <boost/cstdint.hpp>.


Для хранения указателей в виде целых чисел используйте intptr_t, определенный в том же заголовке.

3 голосов
/ 21 февраля 2010

Используйте указатель на uint32_t вместо int.

этот тип (и другие) определен в stdint.h и является частью стандарта C99

0 голосов
/ 22 февраля 2010

На сегодняшний день самым простым решением является получение char* до char[4]. На каждой платформе char[4] является 4-байтовым объектом. Для всей формы волны вам может понадобиться char[4*512]

0 голосов
/ 21 февраля 2010

Возможно, вы могли бы просто использовать assert для sizeof (int), чтобы по крайней мере, если ваши предположения будут нарушены в будущем, вы будете знать.

0 голосов
/ 21 февраля 2010

Один из способов, с помощью которых я видел это, - абстрагирование размера с помощью директив прекомпилятора и typedefs. Затем вы используете абстрагированные типы, которые будут корректны для набора систем, который вы хотите поддерживать.

...