2014-12-30 2 views
3

Я пытаюсь интегрировать PhysX NVIDIA в свою кодовую базу Linux. В некоторых из своих файлов заголовков, он определяет следующие перечислений:Конфликт, вызванный #define макросом и перечислением с использованием того же имени

physxvisualdebuggersdk/PvdErrorCodes.h

struct PvdErrorType 
{ 
    enum Enum 
    { 
    Success = 0, 
    NetworkError, 
    ArgumentError, 
    InternalProblem 
    }; 
}; 

physxprofilesdk/PxProfileCompileTimeEventFilter.h:

struct EventPriorities 
{ 
    enum Enum 
    { 
    None,  // the filter setting to kill all events 
    Coarse, 
    Medium, 
    Detail, 
    Never  // the priority to set for an event if it should never fire. 
    }; 
}; 

что приводит к следующие ошибки компиляции:

/usr/local/include/PhysX3/physxvisualdebuggersdk/PvdErrorCodes.h:36:4: error: expected identifier before numeric constant 
    Success = 0, 
    ^
/usr/local/include/PhysX3/physxvisualdebuggersdk/PvdErrorCodes.h:36:4: error: expected ‘}’ before numeric constant 
/usr/local/include/PhysX3/physxvisualdebuggersdk/PvdErrorCodes.h:36:4: error: expected unqualified-id before numeric constant 

и

/usr/local/include/PhysX3/physxprofilesdk/PxProfileCompileTimeEventFilter.h:46:4: error: expected identifier before numeric constant 
    None, // the filter setting to kill all events 
    ^
/usr/local/include/PhysX3/physxprofilesdk/PxProfileCompileTimeEventFilter.h:46:4: error: expected ‘}’ before numeric constant 
/usr/local/include/PhysX3/physxprofilesdk/PxProfileCompileTimeEventFilter.h:46:4: error: expected unqualified-id before numeric constant 

я определил, что это происходит потому, что X11/X.h #defines как 'None' и 'Успех'. Я подтвердил, что это проблема, поскольку, если я #undef как «Нет», так и «Успех», у меня больше нет ошибок. Однако это, очевидно, не является желательной вещью.

Мой вопрос: Как разработчик, который должен использовать оба этих заголовка, каков правильный курс действий для меня? Должен ли я сообщать об этом NVIDIA в качестве ошибки и ждать исправления или есть что-то, что я могу сделать сам, чтобы решить проблему (помимо #undef)?

Спасибо за ваше время!

+0

С одной стороны, #define имена должны быть во всех шапках. Это обычно устраняет эти проблемы. – NathanOliver

+0

@NathanOliver К сожалению, эти макросы определены в системных заголовочных файлах, которые не могут (и не должны) редактироваться. –

+0

У вас нет выбора, кроме как использовать трюк '# undef', или переименовать значения перечислений, или не включать заголовочные файлы X11 в те же файлы, где используются ваши перечисления. –

ответ

1

Самым разумным направлением является разделение реализаций таким образом, чтобы в рамках вашего проекта вы не включали BOTH конфликтующие заголовки в том же исходном файле. Один файл имеет дело с X и один с PhysX, а затем ваше приложение связывает две реализации вместе.