Предупреждение C4481 нестандартное расширение, используемое в enum 'MyEnum', используемое в квалифицированном имени - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь удалить предупреждения из класса, над которым я работаю.

Предупреждение выглядит следующим образом:

Предупреждение C4482: используется нестандартное расширение: enum 'MyEnum' используется в квалифицированном имени

Я понимаю, что предупреждениевызван попыткой доступа к одному из значений в перечислении, например так:

//Declared in a C header file.
enum MyEnum
{
    Value1,
    Value2,
    Value3 
};

//Exists in some other .cpp file.
void SomeFunc()
{
    MyEnum::Value1; //Generates warning C4482
}

К вашему сведению: SomeFunc () существует в файле .cpp, но перечисление объявлено в файле заголовка C.

Таким образом, один из способов удалить предупреждение - это заменить MyEnum :: Value1 только на Value1.Однако я бы предпочел ссылаться на значения перечисления с помощью MyEnum :: Value1, так как мне нравится, что он более явный.

Так что, если бы я использовал только C ++, я мог бы изменить перечисление следующим образом:

namespace MyEnum
{
    enum 
    {
        Value1,
        Value2,
        Value3 
    };
}

Однако перечисление существует в заголовочном файле C, поэтому я не могу обернуть перечисление в пространство имен.Я также не могу переместить перечисление в заголовочный файл C ++, так как другие файлы уже зависят от перечисления.

Один из способов, который я рассмотрел, заключался в переносе перечисления в структуру:

struct MyEnum
{
   enum Type
   { 
       Value1,
       Value2,
       Value3
   };
 };

Что позволило бы мне получить доступ к значениям с помощью MyEnum :: Value1 без предупреждения.

Однако, есть ли лучший способ добиться этого?

Кроме того, у меня также были ситуации, когда enum существовал в файле C ++, но он был ограничен классом:

class MyClass
{
    enum MyEnum
    {
        Value1,
        Value2,
        Value3
    };
};

Я не хочу перемещать его из класса, потому что класс обеспечивает инкапсуляцию для перечисления, но я также не могу обернуть перечисление в пространство имен, потому что пространства имен не допускаются в объявлении класса.Есть ли лучший способ реализовать такое же поведение (MyEnum :: Value1) в этой ситуации, не вызывая того же предупреждения?

FYI2: я ограничен реализациями, которые разрешены vc10.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Определение перечислителя по имени перечисления является стандартным для C ++ только после C ++ 11.

До этого вы не могли писать MyEnum::Value1 в стандартном C ++.Однако Microsoft разрешила его как расширение еще до того, как оно было стандартизировано.

VC10 предупреждает вас, что ваша квалификация использует расширение, а не что-то стандартное.Если память обслуживает C ++ 11, это не стандарт по умолчанию, используемый VC10.

Поскольку предполагается, что это заголовок C, а имена перечислителей всегда являются членами охватывающей области, у вас нет выхода, но "квалификация "их в пути C"

enum MyEnum { 
    MyEnum_Value1
};
0 голосов
/ 04 февраля 2019

Я не верю, что в стандартном C есть какой-либо оператор ::, поэтому даже в структуре значения enum, скорее всего, будут просто глобальными символами.С его помощью внутри структуры, класса или пространства имен, как вы показали в C ++, он будет доступен с помощью этого оператора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...