char
、signed char
和 unsigned char
是不同/不兼容的基本类型。但是 char *
、signed char *
和 unsigned char *
是否是不兼容的指针类型呢?我知道类型表示部分使得通过任一类型的指针访问相同类型的有符号和无符号版本成为明确定义,只要该值适合有符号类型的正范围内,以及其他保证(例如 unsigned char *
可用于访问任何内容)。 - R.. GitHub STOP HELPING ICE是的,它是一项破坏性变更。先前编译的客户端代码将不再编译(或者可能会生成新的警告),因此这是一项破坏性变更。
char*
和unsigned char*
对齐方式相同。(当然,我会重新编译我的代码,但没有强制要求。) - Jens Gustedt我选择“C--以上都不是”。
虽然这并不是你实际问的问题的直接答案,但对于这种情况的正确解决方案对我来说似乎非常简单明了:你实际上不应该使用任何一个选项。
至少在我看来,如果你有一个很好的理由,你的函数应该接受void *
或(最好)void const *
。你要找的基本上是一个不透明指针,而void *
正是提供这个的。用户不需要知道您的实现内部的任何信息,而且由于任何其他指针类型都会隐式转换为void *
,因此它是少数几个不会破坏任何现有代码的可能性之一。
void *
?这样做会减少类型安全性,并且当用户没有收到警告时会对其造成伤害。 - alternativechar*
和unsigned char*
的指针将以相同的方式在调用约定中传递。一个char*会隐式转换为unsigned char*吗?
void (*)(unsigned char*)
隐式转换为void (*)(char*)
(并在调用时正常工作),因为有人可能会写void (*pfoo)(char*) = &foo;
。就我而言,我有点困惑C语言允许什么,就是这样... - Steve Jessopunsigned char*
”,“在foo中将char*
强制转换为unsigned char*
”,以及“一旦读取完毕,将char
强制转换为unsigned
”。如果最终需要提供一个包装函数来弥补对foo
签名的更改,我认为在第一次就在foo
中进行强制转换可能更好。我认为原始论点是关于一个相当小的事情 - 这个新的foo是否能兼容替代旧的foo? - Steve Jessop