-1

我不知道使用 g ++ 编译错误的原因。我在使用过时的课程吗?

我的 MWE:

#include <iostream>
using namespace std;
int main()
{
system("cls");
cout << "\n\n";
cout <<"\n\t\xDC\xDC\xDB\xDB\xDB\xDB\xDC\xDC";
cout <<"\n\t\xDF0\xDF\xDF\xDF\xDF0\xDF";
cout <<"\n\n";
cout <<"\n\t\xDC\xDC\xDB\xDB\xDB\xDB\xDB\xDB\xDB";
cout <<"\n\t\xDF0\xDF\xDF\xDF\xDF\xDF00\xDF";
cout << "\n\n";
cout << endl;
system("PAUSE");
return 0;
}

**

编译结果:

$ g++ 14.cpp
14.cpp: In function ‘int main()’:
14.cpp:11:9: warning: hex escape sequence out of range
11 | cout <<"\n\t\xDF0\xDF\xDF\xDF\xDF0\xDF";
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
14.cpp:11:9: warning: hex escape sequence out of range
14.cpp:16:9: warning: hex escape sequence out of range
16 | cout <<"\n\t\xDF0\xDF\xDF\xDF\xDF\xDF00\xDF";
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
14.cpp:16:9: warning: hex escape sequence out of range 
$ ./a.out
sh: cls: command not found
4

1 回答 1

2

一个十六进制转义序列应该被格式化为 \Xnn. 它抱怨是因为您提供了 2 个以上的十六进制值,如\xDF0\xDF00

---编辑---

为了完整起见,请引用cppreference

十六进制转义序列没有长度限制,并在第一个不是有效十六进制数字的字符处终止。如果单个十六进制转义序列表示的值不适合此字符串文字中使用的字符类型(char、char16_t、char32_t 或 wchar_t)表示的值范围,则结果未指定。

并停止转义十六进制字符,来自cppreference的另一个引用:

如果在字符串文字中的十六进制转义之后有一个有效的十六进制数字,它将无法编译为无效的转义序列。字符串连接可用作解决方法:

//const char* p = "\xfff"; // error: hex escape sequence out of range
const char* p = "\xff""f"; // OK: the literal is const char[3] holding {'\xff','f','\0'}
于 2019-07-29T19:42:37.033 回答