我面临着变量值的无法解释的变化。现在我在C方面不是很有经验,我用一只手在键盘上写的大部分代码和另一只用K& R跟踪的页面,所以请保持温和。
我在Visual Studio 2010中有一个C项目,一个用于pupnp库的Lua绑定。这是一些相关的代码;
file:luaUPnPdefinitions.h(摘录)
#ifndef LuaUPnPdefinitions_h
#define LuaUPnPdefinitions_h
...
// tracker for library being started or not
volatile static int UPnPStarted;
...
#endif /* LuaUPnPdefinitions_h */
文件:LuaUPnP.h(完整文件)
#ifndef LuaUPnP_h
#define LuaUPnP_h
#include "upnp.h"
#include "upnptools.h"
#include "uuid.h"
#include <lua.h>
#include <lauxlib.h>
#include "luaIXML.h"
#include "darksidesync_aux.h"
#include "luaUPnPdefinitions.h"
#include "luaUPnPsupport.h"
#include "luaUPnPcallback.h"
#endif /* LuaUPnP_h */
file:LuaUPnP.c(摘录)
#include "luaUPnP.h" // only include in this file
...
static int L_UpnpSendAdvertisement(lua_State *L)
{
int result = UpnpSendAdvertisement(checkdevice(L, 1), luaL_checkint(L,2));
if (result != UPNP_E_SUCCESS) return pushUPnPerror(L, result, NULL);
lua_pushinteger(L, 1);
return 1;
}
...
file:LuaUPnPsupport.h(摘录)
#ifndef LuaUPnPsupport_h
#define LuaUPnPsupport_h
//#include <ixml.h>
#include <lua.h>
#include <lauxlib.h>
#include "luaIXML.h"
#include "upnptools.h"
#include "luaUPnPdefinitions.h"
...
UpnpDevice_Handle checkdevice(lua_State *L, int idx);
...
#endif /* LuaUPnPsupport_h */
file:LuaUPnPsupport.c(摘录)
#include "luaUPnPsupport.h" // only include in this file
...
UpnpDevice_Handle checkdevice(lua_State *L, int idx)
{
pLuaDevice dev;
luaL_checkudata(L, idx, LPNP_DEVICE_MT);
if (! UPnPStarted) luaL_error(L, UpnpGetErrorMessage(UPNP_E_FINISH));
dev = (pLuaDevice)lua_touserdata(L, idx);
return dev->device;
}
现在出现问题;
UPnPstarted
静态变量基本上跟踪pupnp库后台进程是否已经启动。
现在在L_UpnpSendAdvertisement
函数的某个时刻进行调试(可重复),然后UPnPstarted == 1
,但是当我点击这一行时;
int result = UpnpSendAdvertisement(checkdevice(L, 1), luaL_checkint(L,2));
并进入它,调试器跳转到checkdevice
函数(在文件LuaUPnPsupport.c中),UPnPstarted
的值立即变为UPnPstarted == 0
。
我输了。它是一个静态变量,所以应该共享,为什么它只是通过踩入其他函数来改变价值?
在调试器的监视窗口中,值被点亮为红色,表示它们刚刚更改。最初我认为包含在错误顺序中的文件和UPnPstarted
变量是重复的(或者有2个实例),但是当将监视添加到监视窗口时; &UPnPstarted
跟踪变量的内存位置,当我进入函数时,我没有看到更改,因此在我看来它指的是相同的内存位置。
我只是不明白。关于发生了什么的任何想法?
答案 0 :(得分:1)
将变量标记为static
并不意味着将在翻译单元之间共享单个实例(基本上是.c
源文件加上它所引入的所有标题)。每个翻译都有自己的UPnPStarted
定义,因为每个.c
文件都包含定义UPnPStarted
的头文件。
这意味着当第一次调用函数UpnpSendAdvertisement()
时,它正在访问它自己的UPnPStarted
版本,该版本尚未修改,并且其初始值不变,值为{{1 }}
要在翻译单元之间共享相同的变量,请在声明时使用0
并提供一个定义:
extern
然后只有一个,/* In the header file. */
extern volatile int UPnPStarted;
文件:
.c