Лучшие практики: я должен создать определение типа для байта в C или C++?

Возможно, это сделает то, что Вы ищете?

import imp
import os
MODULE_EXTENSIONS = ('.py', '.pyc', '.pyo')

def package_contents(package_name):
    file, pathname, description = imp.find_module(package_name)
    if file:
        raise ImportError('Not a package: %r', package_name)
    # Use a set because some may be both source and compiled.
    return set([os.path.splitext(module)[0]
        for module in os.listdir(pathname)
        if module.endswith(MODULE_EXTENSIONS)])
18
задан TobiMcNamobi 28 September 2015 в 14:22
поделиться

6 ответов

Если вы используете C99 или новее, вы должны использовать для этого stdint.h . uint8_t , в данном случае

C ++ не получал этот заголовок до C ++ 11, называя его cstdint . Старые версии Visual C ++ не позволяли использовать C99 stdint.h в коде C ++, но почти все остальные компиляторы C ++ 98 это делали, поэтому у вас может быть этот вариант даже при использовании старых компиляторов.

Как и многие другие вещи, Boost описывает эту разницу в boost / integer.hpp , предоставляя такие вещи, как uint8_t , если стандартная библиотека C ++ вашего компилятора не т.

21
ответ дан 30 November 2019 в 07:33
поделиться

Я предпочитаю, чтобы типы передавали значение хранимых в нем значений. Если мне нужен тип, описывающий байт, как он есть на моей машине, я предпочитаю byte_t , а не unsigned char , что может означать что угодно. (Я работал с кодовой базой, которая использовала либо подписанный символ , либо беззнаковый символ для хранения строк UTF-8.) То же самое касается uint8_t . Его можно было просто использовать как 8-битное целое число без знака.

С byte_t (как и с любым другим метко названным типом) редко когда возникает необходимость искать то, для чего он определен (и если да, то хорошему редактору потребуется 3 секунды, чтобы найти это для вас; может быть, 10 секунд, если база кода огромна), и просто взглянув на нее, становится ясно, что хранится в объектах этого типа.

4
ответ дан 30 November 2019 в 07:33
поделиться

Не считая вашего неудобного соглашения об именах, я думаю, что это может быть нормально. Помните, что boost делает это за вас, чтобы помочь с кроссплатформенностью:

#include <boost/integer.hpp>

typedef boost::uint8_t byte_t;

Обратите внимание, что обычно типы имеют суффикс _t , как в byte_t .

.
1
ответ дан 30 November 2019 в 07:33
поделиться

Я предлагаю, если ваш компилятор поддерживает его, использовать Типы заголовков C99 , такие как uint8_t и int8_t .

Если ваш компилятор не поддерживает его, создайте его. Вот пример для VC ++ , более старые версии которого не имеют stdint.h . GCC поддерживает stdint.h , и действительно большая часть C99

Одна проблема с вашим предложением заключается в том, что знак char определяется реализацией , поэтому, если вы действительно создаете псевдоним типа. вы должны по крайней мере четко указать на знак. В этой идее есть некоторые достоинства, поскольку в C # , например, char является 16-битным. Но у него также есть байтовый тип.


Дополнительное примечание ...

С вашим предложением проблем не было, вы действительно указали unsigned.

Я бы также предложил простой char ] используется, если данные фактически являются символьными данными, т. е. представляют собой простой текст, такой как вы могли бы отобразить на консоли. Это приведет к меньшему количеству проблем с согласованием типов при использовании стандартных и сторонних библиотек. Если, с другой стороны, данные представляют собой несимвольный объект, такой как растровое изображение, или если это числовые данные «маленькое целое число», с которыми вы можете выполнять арифметические операции, или данные, с которыми вы будете выполнять логические операции,

7
ответ дан 30 November 2019 в 07:33
поделиться

Лично я предпочитаю boost :: int8_t и boost :: uint8_t .

Если вы не хотите использовать boost, вы можете одолжить boost \ cstdint.hpp .

Другой вариант - использовать переносную версию stdint.h (ссылка из этот ответ).

2
ответ дан 30 November 2019 в 07:33
поделиться

Я предпочитаю использовать стандартные типы, символы без знака, uint8_t и т. Д., Поэтому любому программисту, просматривающему исходный текст, не нужно обращаться к заголовкам, чтобы разобрать код. Чем больше определений типов вы используете, тем больше времени у вас уйдет на то, чтобы другие узнали ваши правила набора текста. Для структур обязательно используйте typedef, а для примитивов используйте их умеренно.

0
ответ дан 30 November 2019 в 07:33
поделиться