Так что этот код хорошо работает в качестве примера:
#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, который я могу использовать, который позволил бы это?
Вы должны включить запятую в макрос и не выбрасывать 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) Используйте значение по умолчанию:
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
Чтобы быть уверенным, что вы правильно обрабатываете все комбинации — уменьшите количество «управляющих» переменных.
Чтобы процитировать 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