Как избежать дублирования значения перечисления из other .cxx

#c #enums

#c #перечисления

Вопрос:

У меня есть большое количество файлов в моей базе кода. Я пытаюсь скомпилировать свою базу кода, используя другую библиотеку, в которой есть один файл a.h. Я сталкиваюсь с проблемой компиляции, если я включаю, скажем, файл.h в свою базу кода, который уже определил некоторые значения с тем же перечислением, что и в a.h. Например:

в заголовочном файле «a.h»

 typedef enum mylist_s
{
   FIRST,
   SECOND,
   THIRD,
   FOUR,
   ::::::
} mylist_e;
  

в другом файле .cxx, как показано ниже (если он имеет определение, такое же, как определено в mylist)

 static const char FIRST = 1;
  

Я понимаю, что снова есть определение той же переменной.
Я не хочу менять свою кодовую базу с помощью новой переменной.
Кроме того, поскольку a.h включен как в .c, так и в .cxx-файл, я не могу использовать пространство имен для инкапсуляции его с другим именем.

Я также не хочу менять имя в файле.h. Есть ли какой-либо другой способ справиться с этой ситуацией без изменения имени значения перечисления.

Заранее спасибо

Комментарии:

1. Для этого namespace и были изобретены. Вы можете обернуть FIRST = 1 в одно.

2. поместите весь ваш код в пространство имен

3. Я не могу использовать пространство имен, поскольку файл «a.h» также включен в файлы .c. Может быть, нам нужно искать эквивалент пространства имен в .c

4. Вы не следуете. Вы используете nemspace в своих cxx файлах, а не заголовок, который вы не можете изменить.

5. Кстати, у вас также есть возможность размещать #include директивы внутри пространства имен..

Ответ №1:

C namepsace предназначены для предотвращения возникновения конфликтов имен.

Определение всего вашего кода реализации внутри пользовательского пространства имен должно решить проблему.

Ответ №2:

Я использовал для решения той же проблемы, что и упомянутая ниже:

 struct mylist_s
{
    enum Type
    {
        FIRST,
        SECOND,
        THIRD,
        FOUR
    };
};
typedef mylist_s::Type mylist_e;