我遇到的问题是编译器拒绝将我的无符号字符指针转换为有符号字符指针。我曾经使用static_cast来转换符号,所以有点困惑。后来我进行了一些调查研究(虽然不是非常深入,只是简单了解了一下!),即使现在我明白了通过static_cast防止指针类型转换正是它比传统的替代方案更安全和更好的原因(这些替代方案可能会引起实现定义行为或未定义行为),但我仍然不确定我应该为我的情况做什么。
我这里有一个调用OpenGL API函数的签名。
我这里有一个调用OpenGL API函数的签名。
void glShaderSource(
GLuint shader, GLsizei count, const GLchar **string, const GLint *length
);
我最近更改了文件读取器API,现在不再返回char *
类型的从文件读取的数据,而是使用unsigned char *
。我认为这种更改并非错误,因为即使它可能是ASCII数据,无符号字符仍然可以更好地处理原始数据,事实上void *
在这方面可能更清晰。
当然,我会将此指针的地址作为第三个参数传递给glShaderSource
。
我想这样做C风格的强制转换到GLchar **
应该是安全的,实际上这可能是此情况下的标准答案。使用reinterpret_cast
只是多余的操作,但确实只有很少的量。
但是我想了解一下在这种情况下应该考虑什么。为什么我能够忽略这里涉及的字符的符号?难道仅仅因为我不希望编写任何字符高位设置为1的着色器吗?
如果我遇到了带有有符号/无符号整数的情况,并且确实存在将虚假的负整数值解释为大正整数值的严重后果,那么我该如何编写代码来尝试保持“安全”?
我的直觉告诉我,这显然是不可能的,除非实现可以直接检查数据而不是传递指针,因此,在此情况下是否没有办法恢复static_cast
的安全性,因为我被迫使用指针。
p
是一个char *
的情况下,不能写static_cast<unsigned char *>(p)
?这不仅仅是从有符号转换为无符号或反之,而是对指针所指向的内容进行重新解释。 - Praetorianreinterpret_cast
是实际上正确的事情吗? - Steven Luchar
的,因为当时我将其与某些期望char
的东西一起使用。但是,正如你所说,尝试使用带符号的 char 类型进行推理和算术运算是愚蠢的,因此我更喜欢在自己的 API 中将其设置为无符号。对于这种类型的情况,如果必须要,我会重新解释转换...该死,我已经忘记了今天我将它改为unsigned char
的真正原因。可能不是什么非常重要的事情。 - Steven Lu