Я определил пользовательский макрос assert. Это отлично подходит для всех других сравнений. Тем не менее, я получаю ошибку компиляции:C++: ошибка компилятора при сравнении указателей с использованием макросов
ISO C++ forbids comparison between pointer and integer
при использовании макроса, показанное ниже (DWASSERT) сравнивать указатели, как в коде ниже.
#define DWASSERT(condition,printstatement) if(!condition){ printf(printstatement); assert(condition); }
#include <stdio.h>
int main()
{
int target = 0;
int* ptr1 = ⌖
int* ptr2 = ⌖
//Normal comparison works fine
if(ptr1 == ptr2)
printf("Equal");
//Comparison using Macro generates compiler
//error on the next line
DWASSERT(ptr1 == ptr2, "Pointers not equal!\n");
return 0;
}
В то время как я могу просто избегать использования DWASSERT для этого случая, мне любопытно, почему генерируется эта ошибка компилятора.
попробуйте помещать выражение сравнения в круглые скобки, например: 'DWASSERT ((ptr1 == ptr2)," Указатели не равны! \ N ");' – Yaniro
При написании макроса, когда используется один из макропараметров, он должен быть обернут в parens по умолчанию. Только когда-либо удаляйте parens, если вы знаете, что их нужно удалить (и почему). Существует несколько применений макросов, в которых добавление парнеров вызывает проблемы, но подавляющее большинство падает другим путем. –
Вы также должны перенести этот макрос, чтобы он неожиданно не взаимодействовал с операторами 'if' /' else': http://stackoverflow.com/questions/923822/whats-the-use-of-do-while0 -when-we-define-a-macro –