全局范围LPWSTR在更改后恢复

时间:2012-08-13 16:38:32

标签: c++ windows visual-studio-2008 global-variables scope

这可能是一个非常愚蠢的问题,但这是我一直在努力的事情。在方法中更改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 ++中只是非常生疏。

2 个答案:

答案 0 :(得分:5)

是的,确实,LPWSTR中的文字是正确的:“这不应该在这里。”问题是globalStr不是全局的。它在标头中定义为static,因此每个源文件都有自己的globalStr副本。在一个源文件中更改它不会在其他任何文件中更改它。

要解决此问题,请在标头中为其指定extern声明,并在一个源文件中对其进行定义:

// Test.h:

extern LPWSTR globalStr;

// Test.cpp:

LPWSTR globalStr = L“这不应该在这里。”

答案 1 :(得分:1)

在全局变量上使用static时,它不再是全局变量。它仅在声明它的翻译单元(即源文件)中定义。这意味着如果您在头文件中声明static变量并将其包含在多个源文件中,则每个源填充将分别具有一个唯一变量。

也许您的意思是使用extern代替?