如果我有#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);
也许我只是对此采取了不好的做法?
答案 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)。
您可以保留原样,然后当您需要std::string
构造时,可以使用:
std::string myString(GAMENAME);
或者创建一个临时的std::string
对象(如果std::string
在需要时不会自动构建char*
):
std::string(GAMENAME)
您可以拥有const std::string GAMENAME = "POSEIDON";
,然后在需要LPCSTR的任何地方使用GAMENAME.c_str()
返回的那个。