C ++ объявил константу, названную так же, как определенную константу - PullRequest
1 голос
/ 23 августа 2011

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

Моя проблема,

Я пытаюсь скомпилировать мою программу, используя autoconf в linux, который определяет VERSION, но в одном из заголовочных файлов db Mongo они объявляют константу с именем VERSION. Очевидно, есть проблема с присвоением имени переменной с использованием значения правой руки.

Обычно я просто меняю имя, но в данном случае это не моя библиотека. Я мог бы выяснить, как переименовать определенную переменную autoconf.

Есть предложения?

Ответы [ 3 ]

3 голосов
/ 23 августа 2011

Вы должны использовать no-define вместе с AM_INIT_AUTOMAKE в вашем configure.ac файле.

По умолчанию этот макрос AC_DEFINE's PACKAGE и VERSION.Этого можно избежать, передав опцию no-define, например:

AM_INIT_AUTOMAKE([gnits 1.5 no-define dist-bzip2])

См. Руководство по Automake .

0 голосов
/ 23 августа 2011

В общем, нет хорошего способа защитить себя от того, чем какая-либо сторонняя библиотека может загрязнить глобальное пространство имен.Вот почему Бог изобрел пространства имен.

Вы можете использовать пространства имен, если VERSION является глобальным символом, известным во время компиляции:

namespace yourStuff
{
    int VERSION;

    // references to VERSION here refer to the inner VERSION, not ::VERSION
}

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

#ifdef VERSION
 // define it to be something else
#else
#endif

(или используйте #undef, как в ответе Диего, чтобы убить его)

Но выполнение этого везде, где VERSION - это ссылки, будет неприятным.Вам просто нужно не использовать VERSION.

0 голосов
/ 23 августа 2011

Если вы локализовали ошибку, вы можете сделать что-то вроде этого:

const unsigned int OLD_VERSION = VERSION;
#undef VERSION
#include <mongodb_header.h>

и затем использовать OLD_VERSION в своем коде вместо VERSION.Или просто определите свою версию в другом пространстве имен.

Кроме того, сообщите об ошибке в Mongodb.Это неправильное поведение использования просто VERSION в качестве имени во внешнем пространстве имен.Он должен проверить, по крайней мере, VERSION уже определен, или префикс переменной, такой как MONGODB_VERSION, или что-то в этом роде.

...