字符* 和无符号字符* 之间不兼容
Incompatibility between char* and unsigned char*?
以下代码行使用 HP-UX 的C++编译器生成编译器警告:
strcpy(var, "string")
输出:
error #2167: argument of type "unsigned char *"
is incompatible with parameter of type "char *"
请注意:var
是这里的unsigned char *
- 它的数据类型超出了我的控制范围。
两个问题:
- 在这两种类型的上下文中,不兼容意味着什么?如果编译器被迫接受转换,会发生什么情况?如能举个例子,将不胜感激。
- 假设我必须使用
strcpy
,使上述代码行正常工作的安全方法是什么?
C++
严格检查std::strcpy
期望char*
的类型,而变量var
是unsigned char*
。
幸运的是,在这种情况下,将指针投射到如下所示的char*
是完全安全的:
std::strcpy(reinterpret_cast<char*>(var), "string");
这是因为,根据标准,char
、unsigned char
和signed char
可以相互别名。
在 C 标准中,字符是 Impementation Defined。ANSI C 提供三种字符类型(这三种字符都占用一个字节(:字符、有符号字符、无符号字符。不只是像短,int,只有两个。
您可以尝试:
char *str="abcd";
signed char *s_str = str;
编译器将警告代码的第二行是错误的。它就像:
short num = 10;
unsigned short *p_num = #
编译器也会发出警告。因为它们是编译器中定义的不同类型。
因此,如果您编写"strcpy( (char*(var,"string"(",代码只是将字符从"string"的空间复制到"var"的空间。这里是否存在错误取决于您如何处理"var"。因为"var"不是"char *"
char
、signed char
和unsigned char
是C++中的不同类型。 指向它们的指针是不兼容的 - 例如,强制编译器将unsigned char *
转换为char *
以便将其传递给strcpy()
在某些情况下正式导致未定义的行为 - 当指针随后被取消引用时。 因此警告。
与其使用strcpy()
(因此必须强制转换指针(,不如这样做(C++11 及更高版本(
const char thing[] = "string";
std::copy(std::begin(thing), std::end(thing), var);
没有未定义的行为。
更好的是,考虑使用标准容器,例如 std::vector<unsigned char>
和 std::string
,而不是使用原始数组。 所有标准容器都提供了一种访问其数据的方法(例如,用于将合适的指针传递给遗留 API 中的函数(。
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 字符类型转换不兼容
- Qt:如何使不兼容的发送方/接收方参数兼容?
- 视觉工作室 2017;启用 /permissive 时,类型 "const wchar_t *" 的参数与类型 "PWSTR" 的参数不兼容
- 使用不兼容的分配器复制分配无序列图
- 类型为 "int*" 的参数与 C++ 中错误类型"int**"参数不兼容
- 该对象具有与成员函数不兼容的类型限定符.为什么会出现此错误?
- 我正在尝试将表的地址传递给要在另一个函数中使用的指针,但得到不兼容的指针类型
- 为什么范围算法与 std 的迭代器不兼容?
- Winpcap Findalldevs const char * 与 char * 不兼容
- C++ 类型的参数与 void (__cdecl*)(void) 类型的参数不兼容,当调用 std::atexit()
- 字符* 和无符号字符* 之间不兼容
- C++ 奇怪的字符*参数问题(不兼容的类型)
- 确定将宽字符与不兼容的字符 API 一起使用时的最佳做法
- 不兼容的转换字符
- C++ wifstream:不兼容的字符常量*,wchar_t康斯特*类型
- 比较 C++ 中的字符 - 类型为"char"的参数与类型为"const char * "的参数不兼容
- 错误 [Pe167]:类型为"uint16_t *"的参数与类型为"无符号字符 *"的参数不兼容
- 字符串和字符不兼容
- 与指针参数不兼容的无符号字符数组