Межплатформенные примитивные типы данных в C++

Можно попробовать это изменение...

Установка BeautifulSoup и бэкенд lxml (синтаксический анализатор) библиотеки:

user$ pip3 install lxml bs4

Процесс Ваш XML-документ:

from bs4 import BeautifulSoup

with open('/path/to/file.xml', 'r') as doc: 
    for line in doc: 
        print(BeautifulSoup(line, 'lxml').prettify())  
11
задан Tony the Pony 6 September 2009 в 13:41
поделиться

6 ответов

Я нашел этот заголовок особенно полезным: BOOST cstdint

Обычно лучше, чем изобретение собственного колеса (которое требует обслуживания и тестирования).

11
ответ дан 3 December 2019 в 02:30
поделиться

Создайте файл заголовка с именем types.h и определите все примитивы фиксированного размера нужные вам типы (int32, uint32, uint8 и т. д.). Для поддержки нескольких платформ вы можете либо использовать #ifdef , либо создать отдельный каталог include для каждой платформы (include_x86, include_x86_64, include_sparc). В последнем случае у вас будут отдельные конфигурации сборки для каждой платформы, которая будет иметь правильный каталог include в своем пути включения. Второй метод предпочтительнее, согласно «Проблемам C ++» Стивена Дьюхерста.

Кстати, если вы планируете передавать двоичные данные между разными платформами, вам также нужно беспокоиться о порядке байтов.

8
ответ дан 3 December 2019 в 02:30
поделиться

Частью стандарта C99 был файл заголовка stdint.h для предоставления такой информации. Например, он определяет тип с именем uint32_t. К сожалению, многие компиляторы не поддерживают stdint.h. Лучшая кроссплатформенная реализация stdint.h, которую я видел, находится здесь: http://www.azillionmonkeys.com/qed/pstdint.h . Вы можете просто включить это в свой проект.

Если вы используете boost, я считаю, что он также предоставляет что-то эквивалентное заголовку stdint.

5
ответ дан 3 December 2019 в 02:30
поделиться

Определите тип (например, int32) в файле заголовка. Для каждой платформы используйте другой #ifdef и убедитесь, что in32 является 32-битным целым числом. Повсюду в вашем коде используйте int32 и убедитесь, что при компиляции на разных платформах вы используете правильное определение

3
ответ дан 3 December 2019 в 02:30
поделиться

Две вещи:

Во-первых, есть файл заголовка с именем limits.h, который дает много полезной платформы конкретная информация. Например, он предоставит максимальные и минимальные значения для типа int. Исходя из этого, вы можете определить, насколько велик тип int.

Вы также можете использовать для этих целей оператор sizeof во время выполнения.

Надеюсь, это поможет. . .

К

2
ответ дан 3 December 2019 в 02:30
поделиться

Существует заголовок stdint.h, определенный стандартом C99 и (я думаю) тем или иным вариантом ISO C ++. Это определяет хорошие типы, такие как int16_t, uint64_t и т.д., которые гарантированно имеют определенный размер и представление. К сожалению, его доступность не совсем стандартная (Microsoft, в частности, была здесь "ногтем").

Простой ответ таков, который работает на каждой 32- или 64-битной архитектуре с байтовой адресацией, о которой я знаю:

  • Все переменные типа char имеют размер 1 байт
  • Все переменные типа short - 2 байта
  • Все переменные типа int имеют размер 4 байта
  • НЕ ИСПОЛЬЗУЙТЕ "long", который имеет неопределенный размер.
  • Все известные компиляторы с поддержкой 64 битовая математика допускает использование "long long" как собственного 64-битного типа.

Имейте в виду, что некоторые 32-битные компиляторы вообще не имеют 64-битного типа,

1
ответ дан 3 December 2019 в 02:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: