变量值的莫名变化

时间:2013-01-23 08:56:41

标签: c

我面临着变量值的无法解释的变化。现在我在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跟踪变量的内存位置,当我进入函数时,我没有看到更改,因此在我看来它指的是相同的内存位置。

我只是不明白。关于发生了什么的任何想法?

1 个答案:

答案 0 :(得分:1)

将变量标记为static并不意味着将在翻译单元之间共享单个实例(基本上是.c源文件加上它所引入的所有标题)。每个翻译都有自己的UPnPStarted定义,因为每个.c文件都包含定义UPnPStarted的头文件。

这意味着当第一次调用函数UpnpSendAdvertisement()时,它正在访问它自己的UPnPStarted版本,该版本尚未修改,并且其初始值不变,值为{{1 }}

要在翻译单元之间共享相同的变量,请在声明时使用0并提供一个定义:

extern

然后只有一个,/* In the header file. */ extern volatile int UPnPStarted; 文件:

.c