我可以有条件地使用超过 1 个参数吗?
Can I Conditionally Use More Than 1 Argument?
所以这段代码作为示例效果很好:
#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
不起作用,我收到错误消息:
error: invalid use of type void
in parameter declaration
是否有一些允许我使用的 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))
或者在参数中包含逗号,所以这个宏可以在任何地方使用:
#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
为确保您正确处理所有组合 - 减少 "steering" 个变量的数量。
引用 C++ FAQ:
Because #define
macros are evil in 4 different ways: evil#1, evil#2, evil#3, and evil#4. Sometimes you should use them anyway, but they’re still evil.
在这里使用宏没有意义。它只是 #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
所以这段代码作为示例效果很好:
#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
不起作用,我收到错误消息:
error: invalid use of type
void
in parameter declaration
是否有一些允许我使用的 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))
或者在参数中包含逗号,所以这个宏可以在任何地方使用:
#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
为确保您正确处理所有组合 - 减少 "steering" 个变量的数量。
引用 C++ FAQ:
Because
#define
macros are evil in 4 different ways: evil#1, evil#2, evil#3, and evil#4. Sometimes you should use them anyway, but they’re still evil.
在这里使用宏没有意义。它只是 #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