2013-09-03 1 views
1

Я переношу некоторую кодовую базу C++ из Windows VC10 в Mac XCode 10.7. У меня есть макрос, который обертывает «assert()». У компилятора Microsoft нет проблем со следующим определением :XCode C++ утверждать, что переопределение не разрешено компилятором

void assert(bool result, const char *call, const char *file, int line); 
/// Wraps \c assert().// 
#define MY_ASSERT(call) (mynsp::assert((call), #call, __FILE__, __LINE__)) 

в то время как XCode бросает мне ошибку: Слишком много аргументов, чтобы функционировать, как вызов макроса

Будучи полным нубом в OS X и LLVM мой вопрос заключается в том, чтобы обойти эту проблему?

Btw, утверждает() декларация обернута пользовательское пространство имен (mynsp)

+0

Работает отлично с G ++. Сколько аргументов вы передаете макросу? – thokra

+1

У вас есть '' включен где-то? – jrok

+0

Нет, у меня нет. Должен ли я? –

ответ

2

Стандартный заголовок <cassert> (или <assert.h> in C) определяет assert как макрос, что делает его непригодным для использования в любых целях. Даже если вы не включите этот заголовок самостоятельно, возможно, что он включен косвенно из другого заголовка. Вероятно, поэтому вы видите проблему только на одной платформе, а не на обеих.

Лучшим вариантом является переименование вашей функции, чтобы избежать столкновения; альтернативно, вы можете использовать #undef assert в любом файле, который хочет использовать имя для вашей цели.

+0

Действительно, это просто вопрос смены имени. –

1

правой кнопки мыши на assert в своем прототипе и выберите «Перейти к определению». Вы увидите, что это # ​​define'd где-то, вызывая эту проблему для вас.

Вы могли бы #undef assert пройти мимо него.

Смежные вопросы