Могу ли я условно использовать более 1 аргумента?

Так что этот код хорошо работает в качестве примера:

#ifdef DEBUG
#define DECLARE_DEBUG_PARAM(x) x
#define PASS_DEBUG_PARAM(x) x
#else
#define DECLARE_DEBUG_PARAM(x) void
#define PASS_DEBUG_PARAM(x)
#endif

int foo(DECLARE_DEBUG_PARAM(const bool param)) {
#ifdef DEBUG
if(param) {
cout << "DEBUG true\n";
} else {
cout << "DEBUG false\n";
}
#else
cout << "RETAIL\n";
#endif
}

int main() {
foo(PASS_DEBUG_PARAM(true));
}

Живой пример

Но я хочу использовать это для второго параметра, например: int foo(const int param1, DECLARE_DEBUG_PARAM(const int param2)) Очевидно, что это не работает для моего текущего определения DECLARE_DEBUG_PARAMЯ получаю ошибку:

ошибка: неверное использование типа void в объявлении параметров

Есть ли какой-нибудь тип параметра noop, который я могу использовать, который позволил бы это?

0

Решение

Вы должны включить запятую в макрос и не выбрасывать void.

#ifdef DEBUG
#define DECLARE_DEBUG_PARAM(x) , x
#else
#define DECLARE_DEBUG_PARAM(x)
#endif
int foo(const int param1 DECLARE_DEBUG_PARAM(const int param2))

или включите запятую в param, чтобы этот макрос можно было использовать где угодно:

#ifdef DEBUG
#define DECLARE_DEBUG_PARAM(...) __VA_ARGS__
#define PASS_DEBUG_PARAM(...) __VA_ARGS__
#else
#define DECLARE_DEBUG_PARAM(...)
#define PASS_DEBUG_PARAM(...)
#endif

int foo1(DECLARE_DEBUG_PARAM(const bool param)) {
#ifdef DEBUG
if(param) {
cout << "DEBUG true\n";
} else {
cout << "DEBUG false\n";
}
#else
cout << "RETAIL\n";
#endif
}

int foo2(int DECLARE_DEBUG_PARAM(, const bool param)) {
#ifdef DEBUG
if(param) {
cout << "DEBUG true\n";
} else {
cout << "DEBUG false\n";
}
#else
cout << "RETAIL\n";
#endif
}

int main() {

foo1(PASS_DEBUG_PARAM(true));
foo2(0 PASS_DEBUG_PARAM(,true));

return 0;
}

Рабочий код онлайн.

1

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

Я бы предложил несколько разных вариантов.


1) Используйте значение по умолчанию:

enum class DebugSwitch {No_debug, Debug}

void function(int param1, DebugSwitch debug_param = DebugSwitch::No_debug)
{...}

2) использовать параметр объекта

struct Parameters
{
int param1;
bool debug_param;
// ....
};

void function(Parameter& p)
{
///...
}

Зачем? Вы умножаете количество возможных комбинаций значений, которые можно отправить в функцию;

DEBUG defined + param == true
DEBUG defined + param == false
DEBUG not defined + param == true
DEBUG not defined + param == false

Чтобы быть уверенным, что вы правильно обрабатываете все комбинации — уменьшите количество «управляющих» переменных.

1

Чтобы процитировать C ++ FAQ:

Так как #define Макросы являются злыми в 4 разных направлениях: зло # 1, зло # 2, зло # 3, а также зло # 4. Иногда вы все равно должны их использовать, но они все еще злые.

Здесь нет смысла использовать макрос. Это просто #ifdefкод, но требует, чтобы пользователь посмотрел это. Гораздо лучшим подходом было бы просто использовать #ifdef:

int foo(
#ifdef DEBUG
const bool param
#endif
);
int foo(const int param1
#ifdef DEBUG
, const int param2
#endif
);

И чтобы позвонить сделать то же самое:

foo(
#ifdef DEBUG
true
#endif
);
foo(13
#ifdef DEBUG
, 42
#endif
);

Этот код может быть немного изменчивым для функций, принимающих небольшое количество аргументов, и может быть размечен с помощью #else если это считается более читабельным:

#ifdef DEBUG
int foo(const bool param);
#else
int foo();
#endif
#ifdef DEBUG
int foo(const int param1, const int param2);
#else
int foo(const int param1);
#endif

То же самое можно сделать для звонков:

#ifdef DEBUG
foo(true);
#else
foo();
#endif
#ifdef DEBUG
foo(13, 42);
#else
foo(13);
#endif
0
По вопросам рекламы [email protected]