Может ли два перечисления не иметь члена с похожим именем? - PullRequest
1 голос
/ 05 ноября 2019

У меня есть ситуация, когда мне нужно два перечисления, чтобы держать одного члена с тем же именем. Мой код на C ++, с использованием IAR Embeddedj Workbench IDE. Фрагмент кода выглядит следующим образом:

enum Port_e : uint32_t
{
    PortA = 0,
    PortB,
    PortC,
    PortD,
    PortE,
    PortF,
    PortG,
    PortH,
    PortI,
    PortJ,
    PortK,
    NONE
};

enum Pin_e : uint32_t
{
    Pin0 = 0, Pin1, Pin2, Pin3, Pin4, Pin5, Pin6, Pin7,
    Pin8, Pin9, Pin10, Pin11, Pin12, Pin13, Pin14, Pin15,NONE
};

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

Можно ли как-нибудь собрать его, сохранив имя как есть? Я также не хочу менять тип на «enum class», так как это нарушит остальную часть кода моего приложения.

Ответы [ 2 ]

4 голосов
/ 05 ноября 2019

Можно ли как-нибудь собрать его, сохранив имя как есть?

Не без изменений. Если вы поместите Port_e и Pin_e в пространство имен или класс, вы можете разрешить конфликт имен, но это все равно изменит способ использования перечислений.

Я также не хочу менятьвведите "enum class", так как это нарушит остальную часть кода моего приложения.

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

0 голосов
/ 05 ноября 2019

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

#include <iostream>

enum class A :uint32_t { One, Two, Three };
enum class B :uint32_t { One, Two, Three };

int main()
{
    std::cout << int(A::One) << std::endl;
}

Идентификаторы перечисления - это имена целочисленных констант, принадлежащих пространству имен, в котором объявлено перечисление. Перечисления классов изменили эту ситуацию, ноВы не можете использовать их и неявно. Любой другой подход в конечном итоге приведет к поломке ODR, если вы будете использовать простые имена. В вашем коде это приводит к неоднозначности: равен NONE 13? Или до 16?

...