C+中的全局变量+; 我正在使用一些具有定时器的C++代码,定时器运行如下: char buf[1024]; ZeroMemory(&buf, sizeof(buf)); somefunction(buf); // this put stuff into buf otherfunction(buf); // this do stuff with buf

C+中的全局变量+; 我正在使用一些具有定时器的C++代码,定时器运行如下: char buf[1024]; ZeroMemory(&buf, sizeof(buf)); somefunction(buf); // this put stuff into buf otherfunction(buf); // this do stuff with buf,c++,visual-studio-2010,global-variables,C++,Visual Studio 2010,Global Variables,somefunction()执行web请求,InternetReadFile()将数据放入“buf” 但我需要能够在下次执行计时器时读取上一个buf。如何将buf存储在全局变量中并重新分配它,或者在必要时使“buf”等于先前存储的值?如果您不必同时处理访问计时器操作函数的多个线程,则可以将buf设置为函数范围内的静态变量,或者匿名名称空间中的文件变量(或者,如果您是像我这样的未经格式化的C程序员,则将其转换为文件静态变量)。然后确保在知道不想再次查看旧数据之前,代码不会将内存归零 要么: voi

somefunction()执行web请求,InternetReadFile()将数据放入“buf”


但我需要能够在下次执行计时器时读取上一个buf。如何将buf存储在全局变量中并重新分配它,或者在必要时使“buf”等于先前存储的值?

如果您不必同时处理访问计时器操作函数的多个线程,则可以将
buf
设置为函数范围内的静态变量,或者匿名名称空间中的文件变量(或者,如果您是像我这样的未经格式化的C程序员,则将其转换为文件静态变量)。然后确保在知道不想再次查看旧数据之前,代码不会将内存归零

要么:

void timer_action(void)
{
    static char buf[1024];
    ...use buf carefully...
}
或:

如果没有其他东西需要缓冲区,则将其隐藏在函数中会最小化范围,是首选解决方案


如果确实涉及多个线程,则必须非常小心,使用适当的线程同步原语以确保对变量的顺序访问,或者必须在线程本地存储中创建变量的每个线程副本。

如果需要旧的原始数据,是否有问题?而是从当前原始缓冲区中提取感兴趣的片段,并将其作为成员变量存储在类中。对于下一次读取,相关状态可用。如果您的代码是关于状态转换的,那么状态设计模式在这里也很有用


这将帮助您避免与静态变量相关的问题,正如@Jonathan指出的那样

您的问题提到了“InternetReadFile()”,但您的代码只提到了“otherfunction()”—您的意思是什么?“CPP”是指C++而不是C预处理器?你是在处理多个需要使用变量的线程吗?CPP= C++…otherfunction在另一个.cpp文件中,InternetReadFile在其中使用。。。没有线程被使用。
namespace {
char buf[1024];
}

void timer_action(void)
{
    ...use buf carefully...
}