#define string强制转换为LPCSTR或std :: string

时间:2011-11-27 20:34:24

标签: c++

如果我有#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);

也许我只是对此采取了不好的做法?

4 个答案:

答案 0 :(得分:1)

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

使用示例:

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

希望这有帮助。

答案 1 :(得分:1)

#defines由preprocessor处理,因此GAMENAME实际上并不是程序中的变量。使用演员证明你自己的问题的答案似乎会使问题变得更糟。 Mike Dunn在Code Project的第二个article字符串解释了为什么演员表不是最好的选择。 first article显然也值得一读。

您应该能够像这样创建一个std :: string:

std::string str = "char string";

然后从中创建LPCSTR:

LPCSTR psz = str.c_str();

在您的程序中,您可以将 psz 传递给 CreateWindowEx()。值得思考的另一件事是游戏名称是否真的需要改变?如果不是,那就更好地使它成为一个常数。

答案 2 :(得分:1)

预处理器简单地使用

#define来搜索和替换源代码中使用的已定义标记。因此,在之前,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,请将char *替换为kGameName.c_str(),并在CreateWindowEX来电中使用LPCSTR

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

答案 3 :(得分:1)

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()返回的那个。