Как использовать разные перечисления с одинаковыми именами в C - PullRequest
0 голосов
/ 23 марта 2019

У меня есть в одной библиотеке, liba, enum , например:

typedef enum LIB_A_ENUM {
  FOO,
  BAR
} LIB_A_ENUM

В libb У меня есть другое перечисление:

typedef enum LIB_B_ENUM {
  FOO,
  BAR,
  BAZ // has a few different ones.
} LIB_B_ENUM

Я хотел бы использовать оба из них в libb следующим образом:

int
some_function() {
  if (LIB_A_ENUM.FOO) {
    // ...
  } else if (LIB_B_ENUM.FOO) {
    // ...
  }
}

Хотите знать, как делать такие вещи. Я представляю, что мне нужно просто создать группу глобальных переменных, таких как:

LIB_A_ENUM LIB_A_ENUM_FOO = FOO;
LIB_A_ENUM LIB_A_ENUM_BAR = BAR;
// ...
LIB_B_ENUM LIB_B_ENUM_FOO = FOO;
LIB_B_ENUM LIB_B_ENUM_BAR = BAR;
LIB_B_ENUM LIB_B_ENUM_BAZ = BAZ;
// ...

int
some_function() {
  if (LIB_A_ENUM_FOO) {
    // ...
  } else if (LIB_B_ENUM_FOO) {
    // ...
  }    
}

Хотите знать, если это такой подход, или есть лучший способ.

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

Ответы [ 2 ]

1 голос
/ 23 марта 2019

Ты прав. Поскольку значения перечисления хранятся в глобальной области видимости, они должны быть глобально уникальными. Обычные методы предотвращения конфликта имен в enum - это добавление имени перечисления name в качестве префикса для каждого из значений перечисления. Это довольно многословно, но в большинстве случаев должно предотвращать ошибки.

typedef enum LIB_A_ENUM {
  LIB_A_ENUM_FOO,
  LIB_A_ENUM_BAR
} LIB_A_ENUM;

typedef enum LIB_B_ENUM {
  LIB_B_ENUM_FOO,
  LIB_B_ENUM_BAR,
  LIB_B_ENUM_BAZ
} LIB_B_ENUM;

0 голосов
/ 23 марта 2019

Вы не можете.Язык C требует, чтобы имена констант перечисления не конфликтовали друг с другом и другими идентификаторами в той же области действия .Даже глобальные переменные не помогут, потому что вы не можете #include 2 заголовка одновременно ...

Так что ваш выбор сводится к:

  • changeконстанты перечисления, чтобы они имели префикс ... (предпочтительно!)

    • , если вы не можете изменить заголовки библиотеки, то, возможно, вы можете #define макрос до включения конфликтующегозаголовок и #undef впоследствии
  • не используйте их в одной и той же единице перевода

  • или, если вам действительно повезет, выможет #include один из заголовков внутри функции ;определение там не будет противоречить внешнему.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...