在C ++ Builder和VC ++中使用std :: string的差异

时间:2013-04-23 14:48:20

标签: 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无法转换' const char *'到' wchar_t *'。 我错过了什么吗?在所有编译器上都没有相同的工作原因是什么? 感谢

3 个答案:

答案 0 :(得分:6)

欢迎使用Windows Unicode / ASCII地狱。

功能

GetFileAttributes

实际上是一个定义为GetFileAttributesAGetFileAttributesW的宏,具体取决于您是否包含_UNICODE(或UNICODE,或两者兼有?) Windows标头。 *A变体采用char*和相关参数,*W函数采用wchar_t*和相关参数。

我建议直接在新代码中调用宽*W变体。这意味着只针对Windows代码切换到std :: wstring,并为跨平台应用程序选择一些经过深思熟虑的设计选择。

答案 1 :(得分:1)

您的C ++ Builder配置设置为使用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* 

在此处查看有关_T / _TEXT宏的更多详细信息:http://docwiki.embarcadero.com/RADStudio/XE3/en/TCHAR_Mapping

答案 2 :(得分:1)

您已在Builder中定义了_UNICODE和/或UNICODE,但未在VC中对其进行定义。

大多数Windows API有两种版本的ANSI风格和UNICODE风格。

因为,当您致电SetWindowText时,确实没有SetWindowText个功能。相反,有2个不同的功能 - SetWindowTextA采用ANSI字符串 和 - SetWindowTextW,其中包含UNICODE字符串。

如果您的程序是使用/ DUNICODE / D_UNICODE编译的,SetWindowText映射到SetWindowTextW which expects a const wchar_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 / _UNICODE&amp;因此,您可以通过string::c_str()返回char *

在Builder中,您可能已经定义了UNICODE / _UNICODE&amp;它需要wchar_t *

您可能没有明确地完成此UNICODE / _UNICODE事件 - 可能是IDE正在为您执行此操作 - 因此请检查IDE中的选项。

您有很多方法可以解决此问题

  • 在IDE中找到UNICODE / _UNICODE选项并禁用它。

  • 使用std::w_string - 然后c_str()将返回wchar_t *

  • 直接拨打GetFileAttributesA而不是GetFileAttributes - 您需要为这两种变体附带的每个其他Windows API执行此操作。