今天遇到一个这样的bug,花了半小时才解决,就是新版的相机代码把获取相机图像的代码都独立于交互界面这个类之外了,然后设置为全局变量调用,老师给的一份代码是:
extern GX_DEV_HANDLE hDevice;//设备号
static SystemWindow* form = nullptr;//
然后在devc++上运行正常,然后在vs上我按这个做的时候其他的都正常,就是无法显示相机图像,经过一步步的打断点调试,我发现是因为
paintEvent(QPaintEvent* event)
函数在判断
if (image.isNull()) return;
就返回了,说明image是空的,再经过排查,我发现是这里form是空的,所以image没有赋值
if (form)
{
form->setImage(image.copy());
form->update();
//cout<<"setImage and update!"<<endl;
}
但main函数里form是有值的,然后我给form加了一个监听,发现在main.cpp文件是正常的,在systemwindow.cpp中form变为空了,这是为什么呢?我首先再次查看static声明变量时的用法,发现其中有一句是
static只在本文件起作用
,老师的代码正确原因是他在devc++上直接用一个文件把所有代码都包含了,而我在vs上.h,.cpp文件是分开的,所以出现问题,最后我将声明变为extern GX_DEV_HANDLE hDevice;//设备号
extern SystemWindow* form;正常出现图像
顺便总结一下extern和static的区别和联系:
都有一种更改作用域和生命周期的能力,extern是简单的一个标志,就是标志着这个变量是全局变量,其他文件其他地方也能访问,而static是定义静态变量,只能在当前文件被使用。