Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C++;建筑商和VC++;_C++_Visual Studio 2010_C++builder - Fatal编程技术网

C++ 在C++;建筑商和VC++;

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查尔特**’。 我遗漏了什么吗?是什么原因

既然我能接触到新的RAD Studio Xe4,我想我应该试一试。 不幸的是,我对C++的经验不太多,因此我想知道为什么在VC++中完全完美的代码在C++Builder中根本不起作用。 大多数问题都是转换不同的var类型。 例如:

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
    ,而不是
    GetFileAttributes
    ——您需要为这两个变体附带的所有其他Windows API执行此操作

它的工作原理是一样的。但是,在一个环境中,项目设置为使用普通字符,而在另一个环境(C++Builder)中,项目设置为使用宽字符串。谢谢,这正是我想要的。此外,项目选项中有一个设置,等于_TCHAR。选中“char”而不是“wchar”“我觉得这工作也做得很好guess@Henry最好完全避免使用宏和tchar。宏和tchar的存在使得在这两个选项之间切换代码变得容易。相反,你应该直接使用你想要的函数(你应该更喜欢wchar____t函数,因为Windows不支持UTF-8,所以char版本的功能非常差。IMO utf8everywhere.org对在Windows上做正确的事情有很好的建议。)
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
一致。