好吧,这个标题听起来可能有点含糊,但那是因为我不知道如何用不同的方式来表达它。我将尝试解释我的意思:在某些库中,'init' 函数经常接受一些参数,但该参数随后接受多个参数(正确..)。一个例子,就像这样:
apiHeader.h
#define API_FULLSCREEN 0x10003003
#define API_NO_DELAY 0x10003004
#define API_BLAH_BLAH 0x10003005
主.c:
apiInit(0, 10, 10, 2, API_FULLSCREEN | API_NO_DELAY | API_BLAH_BLAH);
这是如何运作的?我无法在任何地方找到答案,很可能是因为我不知道它的实际名称,所以我不知道要搜索什么。这对我当前的项目非常有用。
提前致谢!
最佳答案
参数通常称为“$FOO flags”,值是或
-ed。关键是参数是一个数字类型,它被构造为多个可能值的按位或
。
在处理函数中,值通常用位and
来测试:
if ( (flags & API_FULLSCREEN) != 0 )
您必须小心地以保持 OR 运算线性的方式分配值。换句话说,不要像在 header 中那样在两个不同的 或
可用值中设置相同的位。例如,
#define API_FULLSCREEN 0x1
#define API_NO_DELAY 0x2
#define API_BLAH_BLAH 0x4
有效并允许您解构函数中标志的所有组合,但是
#define API_FULLSCREEN 0x1
#define API_NO_DELAY 0x2
#define API_BLAH_BLAH 0x3
不是因为API_FULLSCREEN | API_NO_DELAY == API_BLAH_BLAH
。
从更高的层次来看,一个flags int是一个穷人的可变参数列表。如果您考虑使用 C++,您应该将此类细节封装在一个类中,或者至少封装在一个 std::bitset
中。
关于c++ - C/C++ 中单个参数(函数)中的多个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8699740/