2

这可能是一个非常愚蠢的问题,但这是我一直在努力解决的问题。在一种方法中更改 LPWSTR 后,它似乎只针对该特定方法进行更改,并在之后立即恢复。我知道全局变量是邪恶的,但这不是我的选择,因为它需要更改相当多的代码。这是我正在做的一个例子:

测试.h

static LPWSTR globalStr = L"This shouldn't be here.";

// The ...s are irrelevant code.
class Test {
    public:
        ...
        void changeGlobalStr();
        void testMethod();
        ...
    ...
};

测试.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;
}

第二测试.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++ 非常生疏。

4

2 回答 2

5

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

要修复它,extern请在标题中声明并在一个源文件中定义它:

// 测试.h:

extern LPWSTR globalStr;

// 测试.cpp:

LPWSTR globalStr = L"这不应该在这里。

于 2012-08-13T16:44:19.017 回答
1

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

也许您的意思是extern改用?

于 2012-08-13T16:43:34.857 回答