ошибка: переопределение 'sync' как пространства имен символов другого типа - PullRequest
0 голосов
/ 20 октября 2019

При использовании googletest я сталкиваюсь со следующей проблемой. Я встроил googletest с

add_subdirectory(src/googletest)

в мой cmake, и он скомпилирован и выполнен нормально.

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

using namespace sync::thbz;

Я использую Google Test для тестирования кода, но я заметил, что когда я хочу протестировать этот конкретный модуль с синхронизацией пространства имен, он не работает, т.е. я получаю

/src/sync.thbz.cpp/src/test/RandomTestString.cpp:26:17: error: expected namespace name
using namespace sync::thbz;
                ^
/usr/include/unistd.h:973:13: note: 'sync' declared here
extern void sync (void) __THROW;
        ^

и другая похожая ошибка:

In file included from /src/sync.thbz.cpp/src/test/RandomTestString.cpp:20:
/srcn/sync.thbz.cpp/src/shared/ByteBuffer.h:48:11: error: redefinition of 'sync' as different kind of symbol
namespace sync::thbz {
          ^
/usr/include/unistd.h:973:13: note: previous definition is here
extern void sync (void) __THROW;
            ^
In file included from /src/sync.thbz.cpp/src/test/RandomTestString.cpp:21:

, когда я иду и смотрю в заголовочный файл / usr / include / unistd.h , который я вижу в строке973 следующий код

/* Make all changes done to all files actually appear on disk.  */
extern void sync (void) __THROW;

есть ли обходной путь для такой проблемы, поскольку я действительно не хочу менять пространство имен только потому, что я решил использовать googletest для этой цели. Что я тут не так делаю? Если я отключу этот модуль с синхронизацией пространства имен, все остальные тесты будут работать нормально. Есть ли обходной путь, который не заставляет меня изменить пространство имен здесь?

1 Ответ

1 голос
/ 21 октября 2019

C ++ имеет пространства имен именно из-за такого рода проблем, а C - нет. На самом деле у вас нет другого выбора, кроме как избегать «известных» имен из каждой библиотеки C (включая POSIX), с которой ваш код может использоваться - сейчас или в будущем! - так же, как вы должны избегать любого другого пространства имен C ++ верхнего уровня. (Технически это является нарушением ODR, даже если конфликтующие объявления никогда не появляются (обычно через #include) в одном и том же модуле перевода, хотя трудно представить, чтобы что-то действительно сломалось.)

Удобно, некоторые библиотеки (включаяWindows API) используют другой NamingConvention, поэтому их символы никогда не вступают в противоречие с those_from POSIX и стандартной библиотекой C ++ (которая, конечно, включает все строчные слова).

...