#定义转换为LPCSTR或std::string的字符串



如果我有一个#define GAMENAME "POSEIDON",并想将其转换为LPCSTR或std::string,我该如何"正确"执行它?

Fx:

m_hwnd = CreateWindowEx(NULL,
    "GLClass",
    /* My GAMENAME #define goes here */
    (LPCSTR)GAMENAME,
    dwStyle | WS_CLIPCHILDREN |
    WS_CLIPSIBLINGS,
    /* The X,Y coordinate */
    0, 0,
    m_windowRect.right - m_windowRect.left,
    m_windowRect.bottom - m_windowRect.top,
    /* TODO: Handle to Parent */
    NULL,
    /* TODO: Handle to Menu */
    NULL,
    m_hinstance,
    this);

也许我只是对此采取了一种糟糕的做法?

#定义由预处理器处理,因此GAMENAME在程序中并不是一个真正的变量。使用演员阵容来证明你自己问题的答案似乎会让问题变得更糟。Mike Dunn在Code Project发表的关于字符串的第二篇文章解释了为什么强制转换不是最好的选择。第一篇文章显然也值得一读。

您应该能够创建这样的std::字符串:

std::string str = "char string";

然后从中创建LPCSTR:

LPCSTR psz = str.c_str();

在程序中,您可以将psz传递给CreateWindowEx((。另一件值得思考的事情是,游戏名称是否真的需要更改?如果不是,最好将其设为常数。

// Instead of a macro use a template called 'GAMENAME'.
template <typename T> T GAMENAME() { return T("POSEIDON"); };

示例用法:

GAMENAME<LPCSTR>();
GAMENAME<std::string>();

希望这能有所帮助。

LPCSTR=指向常量STRing的长指针,它被定义为const char*(即C字符串(。"POSEIDON"是一个字符串文字,类型为const char*(即LPCSTR(。

  1. 你可以让它保持原样,然后当你需要std::string结构时,比如:

    std::string myString(GAMENAME);
    

    或者创建一个临时std::string对象(如果std::string不是在需要时自动从char*构建的(:

    std::string(GAMENAME)
    
  2. 你可以有一个const std::string GAMENAME = "POSEIDON";,然后在任何需要LPCSTR的地方,你都可以使用GAMENAME.c_str()返回的LPCSTR。

#defines仅由预处理器用于搜索和替换源代码中使用的已定义标记。因此,在之前,任何有GAMENAME的地方都会被"POSEIDON"替换,编译器甚至会针对源代码运行。

实际上,在C++中,最好使用static const变量。这将为您的代码提供更多的描述性意义,同时避免预处理器宏的陷阱。这样做最大的"缺点"是必须将静态(非积分(定义和头文件放在一个翻译单元中:

// my_class.h
class MyClass {
public:
    static const char *kGameName;
    MyClass(const RECTANGLE &rect) m_windowRect(rect) {
        CreateWindow();
    }
private:
    HANDLE m_hwnd;
    RECTANGLE m_windowRect;
    HINSTANCE m_hinstance;
};
// my_class.cpp
const char *MyClass::kGameName = "POSEIDON";
void MyClass::CreateWindow() {
    m_hwnd = CreateWindowEx(NULL,
        "GLClass",
        /* My GAMENAME constant is used here */
        kGameName,
        dwStyle | WS_CLIPCHILDREN |
        WS_CLIPSIBLINGS,
        /* The X,Y coordinate */
        0, 0,
        m_windowRect.right - m_windowRect.left,
        m_windowRect.bottom - m_windowRect.top,
        /* TODO: Handle to Parent */
        NULL,
        /* TODO: Handle to Menu */
        NULL,
        m_hinstance,
        this);
}

如果您想使用std::string,请替换我在CreateWindowEX调用中使用char *kGameName.c_str()的位置。

顺便说一下,LPCSTR基本上只是一个#DEFINE LPCSTR const char*

最新更新