C++ 在gcc windows api字符串处理中启用UNICODE

C++ 在gcc windows api字符串处理中启用UNICODE,c++,mingw-w64,winmm,C++,Mingw W64,Winmm,我正在尝试扫描windows wave设备,使用test.cpp中的以下测试片段 使用名称空间std; 包括 包括 包括 int main { int nDeviceCount=waveOutGetNumDevs; 矢量设备; WAVEOUTCAPS-woc; 对于int n=0;ng++.\test.cpp-c .\test.cpp:在函数“int main”中: .\test.cpp:14:27:错误:调用“std::\uuucxx11::basic\u string::basic\u s

我正在尝试扫描windows wave设备,使用test.cpp中的以下测试片段

使用名称空间std; 包括 包括 包括 int main { int nDeviceCount=waveOutGetNumDevs; 矢量设备; WAVEOUTCAPS-woc; 对于int n=0;n PS xxx>g++.\test.cpp-c .\test.cpp:在函数“int main”中: .\test.cpp:14:27:错误:调用“std::\uuucxx11::basic\u string::basic\u stringCHAR[32]”时没有匹配的函数 wstring dvcwoc.szPname; 我认为wstring构造函数包括对c风格的空终止字符串的支持。为什么会出现此错误?

默认情况下,UNICODE宏未定义。这使得pzPname字段在定义中为CHAR pzPname[MAXPNAMELEN]。这就是为什么会出现错误,因为std::wstring正试图使用char数据而不是wchar__t数据进行初始化


要解决此问题,请在包含Windows.h文件之前放置一条define UNICODE语句,或者改用std::string。

是关于将字符串转换为wstring,但答案仍然适用。如果您的代码页不是UTF-8,则必须将字符串正确转换为正确的编码。谢谢,这很有意义。定义UNICODE解决了这个问题。或者,您可以简单地忘记UNICODE,直接使用waveOutDevCapsW/WAVEOUTCAPSW。