Как вернуться к исходному пространству имен после изменения его имени? - PullRequest
0 голосов
/ 19 марта 2012

Я использую библиотеку stlport, которая переопределяет пространство имен std следующим образом:

# if defined (_STLP_REDEFINE_STD)
/*  We redefine "std" to "stlport", so that user code may use std:: transparently */
#   undef  std
#   define std STLPORT
# else

Из-за этого, где бы в моем коде я не пытался использовать std::something, онозаменяется на _STLP::something.

Если я закомментирую строку #define std STLPORT, код моего старого проекта не будет компилироваться (это зависит от stlport).

Если я не закомментирую строку, новая библиотека, которую я пытаюсь добавить, не скомпилируется, потому что она использует std:: с набором распределителей, отличным от того, который использует stlport.Типа столкновения.

Я пробовал #define STLPORT std в строке перед включением новой библиотеки, но этот #define просто не работает.

Есть ли способ использовать обычный std, как только он будет переопределен следующим образом?

Ответы [ 2 ]

1 голос
/ 19 марта 2012

У вас есть две разные реализации STL, одна в STLPORT и одна в стандартной библиотеке. Вашему старому коду нужен STLPORT, а вашему новому коду нужна стандартная библиотека.

Как в новом, так и в старом коде используются такие вещи, как include <vector>, но им нужны разные включаемые файлы с именем vector и, следовательно, различные -I флаги компилятора. Вы не можете скомпилировать их с одинаковыми настройками компилятора.

Если вам не нужно обмениваться стандартными контейнерами и другими данными, связанными с STL, между старым и новым кодом, вы можете скомпилировать старый код с настройками STLPORT и новый код с обычными настройками. Не прикасайтесь к STLPORT, не переопределяйте std в вашем коде. STLPORT не предназначен для такого использования. Он предназначен для замены (частей) стандартной библиотеки. Вы выбираете, какой из них использовать, выбирая правильные флаги компилятора, а не изменяя свой (или STLPORT) источник.

Если вам нужно обменять стандартные контейнеры между старым и новым кодом, вам не повезло. Единственный выход - изменить устаревший код так, чтобы он соответствовал стандарту.

1 голос
/ 19 марта 2012

Вы можете использовать что-то вроде:

# if defined (_STLP_REDEFINE_STD)
#   undef  std
#   define std STLPORT
# else

//....

#ifdef std
#define std_WAS_DEFINED
#undef std
#endif

//new code

#ifdef std_WAS_DEFINED
#define std STLPORT
#endif

//legacy code
...