C: приведите int к size_t - PullRequest
       42

C: приведите int к size_t

12 голосов
/ 30 марта 2011

Как правильно преобразовать / привести int в size_t в C99 на 32-битных и 64-битных платформах Linux?

Пример:

int hash(void * key) {
    //...
}

int main (int argc, char * argv[]) {
    size_t size = 10;
    void * items[size];
    //...
    void * key = ...;
    // Is this the right way to convert the returned int from the hash function
    // to a size_t?
    size_t key_index = (size_t)hash(key) % size;
    void * item = items[key_index];
}

Ответы [ 3 ]

15 голосов
/ 30 марта 2011

Все арифметические типы неявно преобразуются в C. Очень редко вы нуждаетесь в приведении - обычно только тогда, когда вы хотите выполнить преобразование вниз, уменьшая по модулю 1 плюс максимальное значение меньшего типа, или когда вам нужно форсировать арифметику в unsigned.режим использования свойств беззнаковой арифметики.

Лично мне не нравится видеть броски, потому что:

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

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

5 голосов
/ 30 марта 2011
size_t key_index = (size_t)hash(key) % size;

в порядке. Тебе даже не нужен актерский состав:

size_t key_index = hash(key) % size;

делает то же самое.

3 голосов
/ 15 мая 2012

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

если hash() должен возвращать индекс для массива, он также должен возвращать size_t. Поскольку это не так, вы можете получить странные эффекты, когда key_index больше, чем INT_MAX.

Я бы сказал, что size, hash(), key_index должны быть одного типа, наверняка size_t, чтобы быть уверенным, например:

size_t hash(void * key) {
    //...
}

int main (int argc, char * argv[]) {
    size_t size = 10;
    void * items[size];
    //...
    void * key = ...;

    size_t key_index = hash(key) % size;
    void * item = items[key_index];
}
...