C++ 在C++;建筑商和VC++;
既然我能接触到新的RAD Studio Xe4,我想我应该试一试。 不幸的是,我对C++的经验不太多,因此我想知道为什么在VC++中完全完美的代码在C++Builder中根本不起作用。 大多数问题都是转换不同的var类型。 例如:C++ 在C++;建筑商和VC++;,c++,visual-studio-2010,c++builder,C++,Visual Studio 2010,C++builder,既然我能接触到新的RAD Studio Xe4,我想我应该试一试。 不幸的是,我对C++的经验不太多,因此我想知道为什么在VC++中完全完美的代码在C++Builder中根本不起作用。 大多数问题都是转换不同的var类型。 例如: std::string Test = " "; GetFileAttributes(Test.c_str()); 在VC++中工作,但在C++ Builder中它不会编译,告诉我“E2034不能转换‘conchch*’到‘W查尔特**’。 我遗漏了什么吗?是什么原因
std::string Test = " ";
GetFileAttributes(Test.c_str());
在VC++中工作,但在C++ Builder中它不会编译,告诉我“E2034不能转换‘conchch*’到‘W查尔特**’。 我遗漏了什么吗?是什么原因导致所有编译器的工作方式不一样?
谢谢欢迎使用Windows Unicode/ASCII地狱 功能
GetFileAttributes
实际上是定义为GetFileAttributesA
或GetFileAttributesW
的宏,具体取决于您是否使用了\u UNICODE
(或者是UNICODE
,还是两者都有?)在包含Windows标题时定义。*A
变量采用char*
和相关参数,*W
函数采用wchar\t*
和相关参数
<>我建议在新代码中直接调用广域<代码> *W/COD>变体。这意味着切换到STD::WSCOPE只适用于Windows代码和一些跨平台应用程序的精心设计。> P> C++ Cuilder CONFIG被设置为使用Unicode字符集,这意味着Win32 API被解析为其宽字符。因此,在C++代码中需要使用宽字符字符串。如果将VS配置设置为使用Unicode,则会得到相同的错误。 您可以尝试以下方法:
// wstring = basic_string<wchar_t>
// _T macro ensures that the specified literal is a wide char literal
std::wstring Test = _T(" ");
GetFileAttributes(Test.c_str()); // c_str now returns const wchar_t*, not const char*
//wstring=basic\u字符串
//\u T宏确保指定的文字是宽字符文字
std::wstring测试=_T(“”);
GetFileAttributes(Test.c_str());//c_str现在返回常量wchar_t*,而不是常量char*
请在此处查看有关_T/_文本宏的更多详细信息:您已在Builder中定义了
\u UNICODE
和/或UNICODE
,但未在VC中定义它
大多数Windows API有两种风格:ANSI风格和UNICODE风格
例如,当您调用SetWindowText
时,实际上没有SetWindowText
函数,而是有两个不同的函数
-SetWindowTextA
接受ANSI字符串
和
-SetWindowTextW
它采用UNICODE字符串
如果您的程序是用/DUNICODE/D_UNICODE编译的,SetWindowText
映射到SetWindowTextW,它需要一个
const wchar\u t*`
如果您的程序在编译时没有定义这些宏,它将映射到SetWindowTextA
,该程序采用const char*
windows标头通常会执行类似的操作来实现这一点
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif
同样,还有2个GetFileAttributes
DWORD WINAPI GetFileAttributesA(LPCSTR lpFileName);
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName);
在VC中,您没有定义UNICODE/\uUnicode&因此您可以传递string::c\u str()
,它返回一个char*
在Builder中,您可能已经定义了UNICODE/\uUnicode&它需要一个wchar\u t*
您可能没有明确地执行UNICODE/_UNICODE操作—可能是IDE在为您执行此操作—因此请检查IDE中的选项
你有很多方法来解决这个问题
- 在IDE中找到UNICODE/_UNICODE选项并禁用它
- 使用
-然后std::w_string
将返回一个c_str()
wchar\u t*
- 直接调用
,而不是GetFileAttributes a
——您需要为这两个变体附带的所有其他Windows API执行此操作GetFileAttributes
TEXT()
和\u t()
宏受UNICODE
定义的约束。如果未定义UNICODE
,则宏将映射到char
,而不是wchar\t
。由于std::wstring
严格地说只是wchar\u t
,因此编写声明的正确方法是使用L
前缀强制使用宽文本,例如:std::wstring=L”“;GetFileAttributesW(Test.c_str())代码>。否则,如果您真的想使用宏,那么您必须使用std::basic_string
:std::basic_string Test=\u T(“”);GetFileAttributes(Test.c_str())
,这与GetFileAttributes()
自己使用的TCHAR
一致。