Почему C ++ выдает предупреждения для перечислений с отрицательными значениями? - PullRequest
4 голосов
/ 04 ноября 2010

Мой текущий код похож на это:

enum Enum1 : signed __int8
{
    Value1 = 1 ,
    Value2 = 2 ,
    Value3 = -3  // C4341
} ;

Состояние детализации ошибки:
"предупреждение C4341: 'Value3': значение со знаком вне диапазона для константы перечисления"

MSDN гласит, что это предупреждение возникает только при использовании значений за пределами диапазона типа int:
(> 2 ^ 31) ИЛИ (<1 - 2 ^ 31) </p>

Почемуэто говорит мне, что мои отрицательные значения недействительны?Это всего лишь предупреждение, но Google сообщает мне, что это предупреждение указывает на то, что эти значения enum будут неопределенными, что нарушит мою программу.

Ответы [ 4 ]

3 голосов
/ 04 ноября 2010

Похоже, ошибка для меня.Текущий черновик 0x не указывает на то, что это должно быть так, как и документация MSDN .

2 голосов
/ 04 ноября 2010

Я использую Microsoft Visual Studio 2010. Использование "char" или "подписанного символа" вместо "подписанного __int8" дает идентичные результаты - а именно C4341 для "-3" и C4369 для 0xFD
Это другоеВ статье MSDN четко указано, что ": signature __int8" явно указывает базовый тип для перечислителей.При этом можно предположить, что это предупреждение существует просто с целью информирования разработчика о возможных несовместимостях с другими компиляторами.

2 голосов
/ 04 ноября 2010

Ваш ответ в основном описан здесь: Перечисления C ++ подписаны или не подписаны?

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

1 голос
/ 04 ноября 2010

Поскольку кто-то упоминал, что это зависит от компилятора, он работает с g ++, как показано ниже

#include <stdio.h>

enum Enum1
{
    Value1 = 1 ,
    Value2 = 2 ,
    Value3 = -3
} ;

enum Enum1 myval;


main(){
    myval = Value3;
    printf("%d\n", myval);
}

compile: g++ negenum.cpp

результат при запуске: -3

...