【发布时间】:2023-03-26 05:30:01
【问题描述】:
我在尝试初始化长变量时遇到编译错误。
long return_val;
HKEY register_key;
LPTSTR REGISTRY_KEY_FM =
#if FDK_LIBRARY_VERSION==0x13000000
_T("RL13.FR.Document");
#elif FDK_LIBRARY_VERSION==0x09000000
_T("RL9.FR.Document");
#elif FDK_LIBRARY_VERSION==0x08000000
_T("RL80.FR.Document");
#endif
return_val = HKEY_CLASSES_ROOT, REGISTRY_KEY_FM, 0, KEY_QUERY_VALUE, ®ister_key);
最后一行的错误信息是“类型为“long”的值不能用于初始化LPTSTR类型的实体”
我正在使用 Visual Studio 2017,也尝试使用 Visual Studio 2013,但错误相同。但是在 VS 2010 中没有收到消息。VS 2013 和 VS2017 的编译器是否存在一些类型转换问题?如何克服这个问题?
【问题讨论】:
-
请发布一个最小、完整且可验证的示例 - stackoverflow.com/help/mcve。
-
return_val = HKEY_CLASSES_ROOT, REGISTRY_KEY_FM, 0, KEY_QUERY_VALUE, &register_key);对我来说没有意义。我假设您缺少该行的某些部分。 -
T之类的LPTSTR和_T在 1990 年代支持 Windows 9x。除了您的工具无法为那些古老的 Windows 版本生成可执行文件之外,T的东西在 2000 年就已经过时了,因为引入了 Unicode 层。所以你使用了 17 年过时的技术,现在完全没有意义,因为你的工具无法创建这样的可执行文件。使用这些东西有成本:更冗长的代码和更脆弱的代码。所以不要。 -
Re“在 VS 2010 中没有收到消息”,因为你有 不匹配的括号它不能用 VS 2010 编译。看来你错过了一个函数调用.这是你展示的真实代码吗?
-
另外,string literals shouldn't be assigned to non-const pointer(
LPTSTR是TCHAR*的类型定义)。所以你应该写LPCTSTR REGISTRY_KEY_FM =(注意类型中的“C”表示指向的数据的常量)或者更好的LPCWSTR REGISTRY_KEY_FM,并用L"string"替换_T("string"),正如Cheers所解释的那样。