Объясните пожалуйста этот кусочек кода. Написан на C
#define CALL(x) if(counter++ && !(x))error(#x,__LINE__,counter)
Ответы (1 шт):
Макрос - это просто подстановка. Не более и не менее. Отрабатывает она до компиляции. Если компилятор где то встретит CALL(1), то он заменит это на if(counter++ && !(1))error("1",17,counter). А будет ли это правильно и валидно - уже решит компилятор.
В этой подстановке можно заметить несколько особенностей. Во первых, x взят в скобки - это для того, что бы если x - выражение, то что бы не все осталось корректно. Во вторых - это выражение #x - он заменятся на строковое представление - то есть просто само выражение в кавычках. И третье - это специальная "переменная" __LINE__, которая заменяется на номер текущей строки.
Что же получается по факту. Если counter > 0 и выражение x ложно (равно нулю), то вызывается функция error, которой передается три аргумента - само выражение-условие в виде строки, номер строки в файле и счетчик.