Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
В качестве альтернативы @ ответа SingerofTheFall (который исправляет проблему при вызове макроса), вы также можете исправить проблему в самом макросе, сделав ее переменной:
#define MACRO_EXAMPLE(...) foo(__VA_ARGS__)
Это работает, позволяя препроцессору анализировать лямбда на токенах ,
в несколько аргументов, но затем снова использует все эти аргументы и разделительные запятые, поэтому чистый эффект - это то, что вы хотите.
Добавьте еще один круг круглых скобок:
MACRO_EXAMPLE(([i, j](){}));
// ^ ^
В противном случае часть перед ,
интерпретируется как первый параметр макроса, а часть после ,
интерпретируется как второй параметр макроса.