【发布时间】:2020-10-26 22:22:30
【问题描述】:
我正在尝试创建一个程序,当您按下不同的键时播放不同的声音。我打算拿 char key ,添加字符串“.wav”并将名为“sound”的新字符串输入到行中:
PlaySound(TEXT(sound), NULL, SND_FILENAME | SND_ASYNC);
代码无法编译并给出错误“标识符'Lsound'未定义” 我试过用“string”替换“TEXT”,但它给出了错误消息“没有合适的从'std :: string'到'LPCWSRT'的转换函数存在”。
任何有关解决方案的帮助将不胜感激。
#include <iostream>
#include <Windows.h>
using namespace std;
int main() {
char i;
while (true) {
for (i = 8; i <= 255; i++) {
if (GetAsyncKeyState(i) == -32767) {
string sound = i + ".wav";
PlaySound(TEXT(sound), NULL, SND_FILENAME | SND_ASYNC);
}
}
}
return 0;
}
【问题讨论】:
-
为什么失败:
TEXT宏将字符串文字转换为宽字符,如果启用了 unicode,则通过在宏的参数前添加L。TEXT("string")` 被预处理为 @ 987654326@。宏是完全愚蠢的,所以它不在乎你在这里没有使用字符串文字;它会在变量名的前面无意识地添加一个L。 -
TEXT是为了解决 1990 年代后期的一个问题而实现的,因为微软从简单但有限的 ANSI 字符世界切换到 Unicode 字符,并拥有同时支持这两者的工具和操作系统。自从 Windows XP 在 2000 年代初期杀死了它的所有前辈以来,这并不是一个真正的问题。现在是2020年。你可以用这种方式和那种方式来乱七八糟地转换字符串,但简单地从 Unicode 开始并保持在 Unicode 通常要容易得多。