这可能是一个非常愚蠢的问题,但这是我一直在努力的事情。在方法中更改LPWSTR之后,它似乎只是针对该特定方法进行更改并在之后立即恢复。我知道全局变量是邪恶的,但这不是我的选择,因为它需要更改相当多的代码。这是我正在做的一个例子:
Test.h
static LPWSTR globalStr = L"This shouldn't be here.";
// The ...s are irrelevant code.
class Test {
public:
...
void changeGlobalStr();
void testMethod();
...
...
};
Test.cpp的的
#include "Test.h"
Test::changeGlobalStr() {
string testString("This should be here.");
// I manipulate testString over the next few lines so a variable is necessary.
...
BSTR bConversion = _com_util::ConvertStringToBSTR(testString.c_str());
globalStr = bConversion
// This prints out the correct output.
wcout << "globalStr in changeGlobalStr(): " << globalStr;
}
SecondTest.cpp
#include "Test.h"
Test::testMethod() {
changeGlobalStr();
// Get correct output from the print inside the method.
wcout << "globalStr in testMethod(): " << globalStr;
// Now incorrect output is printed.
}
testMethod()最终打印出“这不应该在这里”而不是“这应该在这里”。我不完全确定我做错了什么,但我觉得这是一些基本的东西,而且我的C ++中只是非常生疏。
答案 0 :(得分:5)
是的,确实,LPWSTR中的文字是正确的:“这不应该在这里。”问题是globalStr不是全局的。它在标头中定义为static
,因此每个源文件都有自己的globalStr副本。在一个源文件中更改它不会在其他任何文件中更改它。
要解决此问题,请在标头中为其指定extern
声明,并在一个源文件中对其进行定义:
// Test.h:
extern LPWSTR globalStr;
// Test.cpp:
LPWSTR globalStr = L“这不应该在这里。”
答案 1 :(得分:1)
在全局变量上使用static
时,它不再是全局变量。它仅在声明它的翻译单元(即源文件)中定义。这意味着如果您在头文件中声明static
变量并将其包含在多个源文件中,则每个源填充将分别具有一个唯一变量。
也许您的意思是使用extern
代替?