问:多个cpp同时使用一个全局变量,最好的实现方法 常使用的如在C中使用extern在class中使用static为什么使用namespace不行为什么不能直接在cpp中加static再引入 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在某一个CPP里面 UINT g_nIndex = 0;在stdafx.h里面extern UINT g_nIndex;如果多个CPP只是读取那没什么,要是还有写操作,最好用互斥量.#include "afxmt.h"CCriticalSection cs;{cs.Lock();g_nIndex = 1;cs.Unlock();} 在某一个CPP里面 UINT g_nIndex = 0;在stdafx.h里面extern UINT g_nIndex;我一般用这种方式 如果是使用该方法,如果这样的数据结构多了就很难维护,我现在比较喜欢使用一个专门的class来维护这些全局数据结构 把你的公用变量放在App类里面,外部用AfxGetApp()获取App对象指针,用该指针来取这个变量也可以。 不一定使用MFC来开发程序,我常常使用ATL/COM所以有能使用App类 在某一个CPP里面 UINT g_nIndex = 0;在stdafx.h里面extern UINT g_nIndex; static 只能在本编译单元中使用,不能extern导出 namespace::globeVariable不可以的吗? 你可以写一个自动互斥访问的template类template<class T>class MutexAccess{private: T m_Member; CMutex m_Mutex;public: T& operator T() { //锁定 return m_Member; //解锁 } T& operator =(T newvalue) { //lock m_Member = value; return m_Member; //unlock }};上面的类还要有mutex的创建过程,可以在构造函数里创建用的使用定义变量如下:MutexAccess<int> m_GlobalValue;这样可以保证你的变量是线程访问安全的.如果是仅仅定义一个变量随便在那个cpp中定义然后在其它地方用extern 变量名 声明就可以了. namespace 对应的是数据类型,而你使用的是具体的变量,cpp好象只有enum可以这么用. 应该是namespace::操作符号的问题. :: 是个范围的操作符号, :: 是不是可以从namespace 中取出变量? namespace 怎么个不行法?是不是说找不到那个namespace?如果是这种情况,那么其他使用这个namespace的函数必须也有这个namespace的声明,比如下面的例子://a.cpp#include <iostream>#include "b.h"// 回 hdqqq(小西瓜) namespace中可以有定义也可以有变量,比如下面的//std::cout,std::endl,space::b都是变量int main(){ std::cout << space::b << std::endl; return 0;}//b.h//必须的,这样a.cpp才能知道存在space这个namespace//我曾经犯过错,使用了using namespace std但是没包含任何标准C++头文件// 于是编译器报告找不到namespace std;namespace space{ extern int b;}b.cpp#include "b.h"namespace space{ int b = 10;}编译方法:cl /c a.cpp /EHsccl /c b.cpplink /out:a.exe a.obj b.obj 我试验了一下,没有namespace的时候用extern 变量有了namespace 只要namespace spacename{ extern 变量};就可以使用在spacename命名空间中的其它cpp文件中定义的变量了。就是说在extern外面在 加上 namespace。 _DllMain@12 已经在 dllmain.obj 中定义 IDispatch error #3105 单片机与PC机通信时数据类型的疑问 请教高手:对同一个缓冲区,一个线程往里写数据,一个从中读取数据,需不需要做临界区同步处理? 自己写了个鼠标驱动,如何编程更新系统的鼠标驱动? 关于ImageDirectoryEntryToData的使用(如何获得其它进程的地址) 请问一个关于设备枚举的问题,谢谢! 请教一个问题:在服务管理器里面停止一个服务,IIS停止响应了 cview绘文本问题 跪求技术支持怎么操控网页元素 求一思路(关于聊天室的) 记事本中的“自动换行”是怎么弄的
#include "afxmt.h"
CCriticalSection cs;{
cs.Lock();
g_nIndex = 1;
cs.Unlock();
}
我一般用这种方式
class MutexAccess
{
private:
T m_Member;
CMutex m_Mutex;
public:
T& operator T() {
//锁定
return m_Member;
//解锁
}
T& operator =(T newvalue) {
//lock
m_Member = value;
return m_Member;
//unlock
}
};上面的类还要有mutex的创建过程,可以在构造函数里创建
用的使用定义变量如下:
MutexAccess<int> m_GlobalValue;
这样可以保证你的变量是线程访问安全的.如果是仅仅定义一个变量随便在那个cpp中定义然后在其它地方用extern 变量名 声明就可以了.
//a.cpp
#include <iostream>
#include "b.h"
// 回 hdqqq(小西瓜) namespace中可以有定义也可以有变量,比如下面的
//std::cout,std::endl,space::b都是变量
int main()
{
std::cout << space::b << std::endl; return 0;
}
//b.h
//必须的,这样a.cpp才能知道存在space这个namespace
//我曾经犯过错,使用了using namespace std但是没包含任何标准C++头文件
// 于是编译器报告找不到namespace std;
namespace space
{
extern int b;
}
b.cpp
#include "b.h"namespace space
{
int b = 10;
}
编译方法:
cl /c a.cpp /EHsc
cl /c b.cpp
link /out:a.exe a.obj b.obj
没有namespace的时候
用extern 变量有了namespace 只要namespace spacename
{
extern 变量
};就可以使用在spacename命名空间中的其它cpp文件中定义的变量了。就是说在extern外面在 加上 namespace。