Получение слишком большого количества аргументов для ошибки компиляции при вызове функции-макроса при определении лямбды внутри assert (assert.h) в Xcode [c ++]

Я использую макрос утверждения из assert.h
Я определил лямбду для проверки утверждений.

int val1 = 0;
int val2 = 1;

const auto check = [val1,val2]()-> bool
{
return val1 < val2;
};
// no error for this call
assert(check() && "Test is failed");

// no error for this call
assert([=]()-> bool
{
return val1 < val2;
}() && "Test is failed");
//compile error for this call "too many arguments provided to function-like macro invocation"assert([val1,val2]()-> bool
{
return val1 < val2;
}() && "Test is failed");

почему я получаю

слишком много аргументов для вызова функции как макроса

ошибка компиляции для случая, когда я использую макрос assert и определяю лямбду с более чем одним аргументом в списке захвата?

6

Решение

Проблема заключается в запятой в списке захвата.

Препроцессор имеет чрезвычайно ограниченное понимание синтаксиса C ++, он в основном выполняет тривиальную подстановку текста. Если запятая не находится между совпадающими внутренними скобками (и, конечно, не является частью токена, подобного строковому литералу), препроцессор будет обрабатывать ее как разделитель аргументов вызова макроса.

Таким образом, препроцессор думает, что вы вызываете assert с двумя аргументами [this и остальная часть материала за первой запятой, которая выдает ошибку.

Вы можете исправить эту ошибку, используя дополнительный набор скобок:

int i = -7, j = 7;
assert(([i,j](){return i + j;}()));

Для стандартных любителей:

Последовательность токенов предварительной обработки, ограниченная внешними соответствующими скобками, образует список
аргументы для функционально-подобного макроса. Отдельные аргументы в списке разделяются запятой
токены предварительной обработки, но токены предварительной обработки запятых между соответствующими внутренними скобками не разделяются
аргументы.
Если в списке аргументов есть последовательности токенов предварительной обработки, в противном случае
действуют как директивы предварительной обработки, 155 поведение не определено.

16,3/11 в N4140, выделено мое.

6

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

Препроцессор очень прост, он видит все запятые как разделители аргументов.

Таким образом, вы не можете использовать макрос, если передаете что-либо с запятой в качестве аргумента макроса.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector