c++函数接受整型,但示例显示文本
C++ function takes ints, but example shows text?
这是一个让我困惑的c++问题。(长时间使用c++后,我正在刷新我的c++)。我正在这里读这个例子。有两部分让我很困惑:
第一部分:
在代码行中:
void namedWindow(const string& winname, int flags=WINDOW_AUTOSIZE )
WINDOW_AUTOSIZE是一个输入,但据我所知,它不是int型。当我编写这行代码并运行时,它工作得很好。我在这个函数中的输入是'WINDOW_AUTOSIZE'。我很困惑为什么这是有效的。WINDOW_AUTOSIZE是怎么变成int的?
我的第二个问题是关于最后一行,他们说:
默认情况下,flags == CV_WINDOW_AUTOSIZE | cv_window_keepatio |CV_GUI_EXPANDED
我很困惑,这究竟意味着什么……我知道|是位或,但不清楚这到底意味着什么…
谢谢。
大写字母的单词为常量。它们已经在代码的某个地方定义,或者在另一个地方使用的头文件中定义。常数可以表示数字、字符串等。这段代码中的常量显然属于int
CV_WINDOW_AUTOSIZE | CV_WINDOW_KEEPRATIO | CV_GUI_EXPANDED
只是常数所代表的int
值的位或。这些是空间常量,其中仅设置int
的一位(即所谓的标志)
设CV_WINDOW_AUTOSIZE
为0x1, CV_WINDOW_KEEPRATIO
为0x2。所以按位或运算的结果是0x3。然后,被调用的函数可以通过and操作检查设置了哪个标志。
我在这个函数中的输入是'WINDOW_AUTOSIZE'
是的,WINDOW_AUTOSIZE
实际上是一个整数;是int
函数参数的默认实参。如果它不是int
// it might have been defined like this
#define WINDOW_AUTOSIZE 23434 // some number just for example
// or like this
const int WINDOW_AUTOSIZE = 34234;
对于第二个问题,按位OR
表示相应整数值中的所有位都是按OR
组合在一起的,所以我们说,例如
CV_WINDOW_AUTOSIZE = 0x0010
CV_WINDOW_KEEPRATIO = 0x0100
CV_GUI_EXPANDED = 0x1100
则相应的运算将给出一个整数值,每个位都等于OR
对每个位置
CV_WINDOW_AUTOSIZE | CV_WINDOW_KEEPRATIO | CV_GUI_EXPANDED =
0x0010
0x0100
0x1100
------
0x1110
关于bitflags的使用
你有一个有4个键的键盘:Ctrl, Alt, Del, Shift
你需要多少个常量来定义这个键盘可以打开的所有状态?我们来列举状态
所有4个键按下:1常数
按下3个键:它需要(4 × 3)常数= 4个常数:
(4 by 3) = 4! / ( (4-3)! * 3! ) = 4
2:按下的按键(4×2)= 6常量
1键按下:4个常量(键名)
未按下键:1常数
所以总结一下你可以定义:
1 + 4 + 6 + 4 + 1 = 16 constants
:
如果我告诉你只需要4个不同的常数,每个只有一个位是ON的呢?#define CtrlK 0x0001
#define AltK 0x0010
#define DelK 0x0100
#define ShiftK 0x1000
那么键盘的任何状态都可以通过以上的组合来表示:假设您想要表示按下Shift键和Del键。那么它就是
CtrlK | DelK
您拥有的组合越多,该技术的回报就越多。
当然(也许你可以看到有关bitflags的参考),用户代码可以探测整数值,以查看哪些位被打开。
我相信WINDOW_AUTOSIZE不是字符串或文本。它将是一个常量或#defined预处理器常量。所以int数据类型可以接受它。请检查源代码中WINDOW_AUTOSIZE的定义。还请注意,我们可以将'char', 'enum'数据类型的变量传递给接受int的函数。到int的转换将在内部进行。
- 尝试使用 WinBGI 显示文本时出现编译器错误
- 动态填充的组合框不显示文本,列表未定义
- QTreeWidgetItem 突出显示文本问题
- 如何通过单击按钮在QTextEdit中显示文本?
- 在C Windows程序中显示文本文件内容
- findChild 从不显示文本浏览器
- C 在同一行中左右显示文本
- 使用 C++ 中的向量在新行上显示文本文件中的列
- 如何使用 Opengl 库显示文本文件中的 3D 点
- Qt. 方法显示文本() 如果我在 QStyledItemDelegate 中定义了 paint() 方法不起作用
- 如何在C 中的OpenGL中通过矩形显示文本
- 如何使用键盘输入和sf ::文本在SFML中添加一种文本框以显示文本字符串
- QMessageBox:无法在框中显示文本(使用 c++)
- 延迟窗口在 MFC 上显示文本
- Visual Studio代码集成的终端未显示文本
- SFML-不显示文本
- qprogressdialog未显示文本标签
- C++程序无法正确显示文本文件中的内容
- 如何在不显示文本的情况下分配Win32编辑控件的窗口名称
- SDL2 OpenGL SDL2_TTF:显示文本