【发布时间】:2013-01-23 08:56:40
【问题描述】:
我正面临变量值发生无法解释的变化。现在我对 C 语言不是很熟悉,大部分代码我是一只手在键盘上写的,另一只手在 K&R 中跟踪页面,所以请温柔。
我有一个 C 项目,在 Visual Studio 2010 中,一个用于 pupnp 库的 Lua 绑定。这是一些相关的代码;
文件: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 */
文件: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;
}
...
文件: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 */
文件: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 跟踪变量的内存位置,当我进入函数时我没有看到变化,所以在我看来它指的是相同的内存位置。
我只是不明白。对正在发生的事情有任何想法吗?
【问题讨论】:
标签: c