Зачем использовать MOCK_NON_CONST_METHOD_EXT для оператора float () в Boost Turtle?

Я использую Boost 1.46 с Turtle lib 1.2.4 и компилятором из Visual Studio Express 2013. У меня есть следующий класс для MOCK:

struct IPredicate
{
virtual ~IPredicate() {}

virtual bool operator()(float value) = 0;
};

Когда я высмеиваю operator () с помощью MOCK_NON_CONST_METHOD:

MOCK_BASE_CLASS(MockPredicate, IPredicate)
{
MOCK_NON_CONST_METHOD(operator(), 1, bool(float), id)
};

Я получил кучу ошибок компилятора, например синтаксическая ошибка «оператор» и так далее. Но когда я высмеиваю это с MOCK_NON_CONST_METHOD_EXT:

MOCK_BASE_CLASS(MockPredicate, IPredicate)
{
MOCK_NON_CONST_METHOD_EXT(operator(), 1, bool(float), id)
};

все в порядке и работает отлично! В соответствии с http://turtle.sourceforge.net/turtle/reference.html MOCKS с суффиксом EXT предназначены для «компиляторов без поддержки variadic-макросов», но тот, который я использую, имеет поддержку (проверил это на следующих примерах: http://msdn.microsoft.com/en-us/library/ms177415.aspx ). Остальная часть документации не совсем понятна по этому делу.

Кто-нибудь может объяснить мне, что здесь происходит? Почему у меня возникают ошибки, когда я не использую версию MOCK с суффиксом EXT?

2

Решение

Ответ сторонника заключается в том, что, как правило, нет никаких гарантий в отношении вариационных макросов, поскольку вариационные макросы нестандартны в C ++ 03 (но стандартны в C ++ 11). Так что если у вас есть метод, который избегает вариационных макросов, вам определенно следует использовать его вместо метода с вариационными макросами.

Хотя на практике очень вероятно, что библиотека черепах не была тщательно протестирована с msc и просто использует одно из нестандартных расширений gcc для макросов. Расширения обсуждаются на Variadic Macros http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html стр. В частности, чтобы библиотека turtle была переносимой только для всех совместимых с C99 компиляторов __VA_ARGS__ может быть использован.

С макросами, когда вы находитесь после корневого регистра — используйте ключ / P для msc (Предварительная обработка в файл) создать .i файл с расширенными директивами препроцессоров, где вы можете проверить, чем он недоволен.

Обновить. Закончив эту длинную историю, я решил быстро скачать черепаху и проверить, как определяется макрос. И, как я сделал, я обнаружил, что это просто печальный случай необслуживаемой документации. Запуск grep в библиотеке включает в себя не могу найти MOCK_NON_CONST_METHOD определяется на всех. Вот почему вы получаете синтаксические ошибки. Еще одна причина избегать макросов — ясность и корректность сообщений об ошибках C ++.

2

Другие решения

(Я автор черепахи)

Что произошло с 1.2.4, так это то, что по той причине, что я на самом деле не исследовал предоставленный код, это на самом деле 1.2.1 вместе с документацией 1.2.4.
Поскольку никто не жаловался, открыв билет прямо на sourceforge, я не заметил, пока прошло довольно много времени (все мои личные и корпоративные проекты, использующие turtle, постоянно интегрированы с последним исходным кодом).

В любом случае, я только что протестировал ваш код, и он компилируется с MSVC 2013, turtle 1.2.6 и boost 1.55. Если вы еще этого не сделали, подумайте об обновлении.

1

По вопросам рекламы [email protected]