Почему перечисления с отрицательными значениями вызывают проблемы в Objective-C / C? - PullRequest
7 голосов
/ 19 февраля 2011

По различным причинам реализации я определил следующее перечисление:

typedef enum HBSnakeMovementDirection
{
    HBSnakeMovementDirectionUp = 1,
    HBSnakeMovementDirectionDown = -1,
    HBSnakeMovementDirectionRight = 2,
    HBSnakeMovementDirectionLeft = -2
}
HBSnakeMovementDirection;

Однако, если я попытаюсь использовать HBSnakeMovementDirectionRight, я получу следующее предупреждение:

Implicit conversion changes signedness: 'int' to 'HBSnakeMovementDirection'

Нет проблем с другими значениями перечисления.В чем здесь проблема?Я думал, что это может быть связано со смешением отрицательных и положительных значений перечисления, но я не могу найти ничего определенного по этому поводу.

(я смог придумать все положительные значения перечисления, которые позволяют мне работатьвокруг этой проблемы, но она все еще ставила меня в тупик, поэтому я решил спросить об этом)жалобы - и относитесь к ним как к ошибкам.(Мне нравится быть максимально строгим во время компиляции.) Я использую LLVM 1.6.

UPDATE 1 : буквально любое использование HBSnakeMovementDirectionRight приводит к предыдущему предупреждению:

HBSnakeMovementDirection movementDirectionRight = HBSnakeMovementDirectionRight;

Я должен привести HBSnakeMovementDirectionRight к HBSnakeMovementDirection, чтобы отключить предупреждение.

ОБНОВЛЕНИЕ 2 : В соответствии с запросом приведена вся команда построения, которая выполняетсявыпущено на моей машине:

http://pastie.org/1580957

ОБНОВЛЕНИЕ 3 : Вот точный проект, над которым я работаю, размещенный на GitHub:

https://github.com/LucasTizma/Hebi

В частности, следующее дерево:

https://github.com/LucasTizma/Hebi/tree/89262e2e53881584daf029e3dd5f1e99dfbd6f96

Ответы [ 3 ]

3 голосов
/ 19 февраля 2011

Как сказал Даррен, это похоже на ошибку компилятора, а Дейв сказал, что этого не происходит с Clang 2.0.

Я обнаружил, что следующее определение типа компилирует код OP с Clang 1.6:

typedef enum HBSnakeMovementDirection 
{
    HBSnakeMovementDirectionUp = 1,     // Default movement direction upon initialization via -init
    HBSnakeMovementDirectionDown = -1,
    HBSnakeMovementDirectionLeft = -2,
    HBSnakeMovementDirectionRight = 2,
    NBSnakeMovementDirectionNone = -3
}
HBSnakeMovementDirection;

(обратите внимание на дополнительные NBSnakeMovementDirectionNone)

Это может быть связано с ошибкой LLVM 1884 , которая была исправлена.

1 голос
/ 19 февраля 2011

Определенно выглядит как ошибка компилятора.Я открыл проект в Xcode 3 и скомпилировал, и получил ошибку.Когда я открыл проект в Xcode 4 и использовал компилятор clang2.0, я не получил предупреждений.

1 голос
/ 19 февраля 2011

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

Поведение одно и то же, независимо от того, указываете ли вы «2» или «HBSnakeMovementDirectionRight»: оно принимает 1 и отклоняет 2.

Редактировать: я протестировал это в существующем проекте iPhone, установив компилятор LLVM 1.6 и установив флаг -Wconversion.

typedef enum HBSnakeMovementDirection
{
    neg1 = -1,
    pos1 = 1,
    pos2 = 2,
} HBSnakeMovementDirection;

HBSnakeMovementDirection d = -3;  // Warning: Can't convert int to HBSnakeMovementDirection
HBSnakeMovementDirection d = -2;  // OK
HBSnakeMovementDirection d = -1;  // OK
HBSnakeMovementDirection d = 0;  // OK
HBSnakeMovementDirection d = 1;  // OK
HBSnakeMovementDirection d = 2;  // Warning: Can't convert int to HBSnakeMovementDirection
HBSnakeMovementDirection d = pos2;  // Warning: Can't convert int to HBSnakeMovementDirection
...