Препроцессор не имеет понятия о типах, поэтому при объявлении #define
с типами, вам не нужно указывать тип параметра:
#define CHECK_CONDITION(condition, start, curr) { if(condition == "") return true; return (table.commonIn() == "team_id"? list()[start]->team() ==list()[curr]->team() :list()[start]->team() ==list()[curr]->team())}
Кроме того, #define
является расширенный, где вы его используете (препроцессор заменяетCHECK_CONDITION
с этим блоком кода), поэтому ваш код не будет компилироваться по одной причине: вы будете вставлять if
внутри условия if
, что является синтаксической ошибкой.
Используйте функцию (возможно, встроенный), вместо:
inline
bool check_condition(QString condition, int start, int curr) {
if(condition == "") return true;
return (
table.commonIn() == "team_id"?
list()[start]->team() == list()[curr]->team():
list()[start]->team() == list()[curr]->team()
)
}
Это также делает явное возможную ошибку синтаксиса здесь: я не знаю, что ты имел в виду последние две строки, так что я оставил это нетронутым ...
Мои 2центы: вы должны увидеть препроцессор на C++ в качестве последнего средства: у вас есть шаблоны, константные переменные и встроенные функции.
Основная причина, по которой он остался на C++ (вместо того, чтобы использовать одно ключевое слово include
или тому подобное) заключается в том, чтобы сохранить обратную совместимость с C. Никогда не используйте препроцессор, если какое-либо другое решение не является чрезмерно сложным.
У аргументов макроса нет типов, оставьте 'QString'. –
Почему бы не использовать функцию 'inline' вместо макроса? –
@AlokSave: Возможно, OP хочет сгенерировать код, который легко интроспективен после этапа препроцессора и т. Д., Или просто хочет изучить макропрограммирование. – lpapp