# определить конфликт с моим типом данных и элементом перечислителя

#c #x11

#c #x11 #c

Вопрос:

Мой тип данных с именем «Bool», который находится внутри пространства имен, конфликтует с #define Bool int, который определен в некотором заголовочном файле Xlib. Кроме того, то же самое происходит, когда я помещаю элемент с именем «None» внутри любого перечислителя из-за определения #define None 0L . Я пытался использовать #undef Bool в нескольких файлах, но это просто превратилось в беспорядок. Должен ли я переименовать тип данных во что-то вроде «Boolean» и навсегда прекратить использование «None»?

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

1. В общем, вам действительно следует избегать затенения имен имен стандартных типов, классов и т. Д. Вы столкнетесь с гораздо большими проблемами, чем стоит иметь дело.

2. Я делаю его кроссплатформенным. Это должно работать и для старых консолей.

3. Кроме того, как насчет случая, когда я использую имя «None» для любого элемента перечислителя?

4. Есть ли какая-то причина, по которой Xlib использует #define Bool int , а нет typedef int Bool ?

Ответ №1:

Если вы программируете на Xlib, вам следует избегать переопределения Bool , True , False и None (а также XID и XPointer и Status ), чтобы избежать конфликтов со значениями #define и typedef в заголовках Xlib.

Поскольку вы используете C 11, вам следует либо использовать Xlib Bool , либо использовать стандартный C bool в своем коде. Ваша жизнь будет проще, если вы сможете изолировать файлы Xlib #include от как можно меньшего количества единиц компиляции (исходных файлов) и использовать стандартный C bool везде.

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

1. О’кей, я понимаю твою точку зрения. Но на самом деле я переношу свою библиотеку из Win32, где она работала отлично, и я хотел бы продолжать использовать текущий дизайн. На самом деле я просто использую файлы Xlib в трех своих файлах: window, graphic-creation и заголовочном файле OpenGL.