我遇到的是我的编译器拒绝将我的unsigned char指针强制转换为带符号的char指针.我困惑了一会儿,因为我一直使用static_cast来转换签名时间最长.
然后我做了一点挖掘(好吧,它不是很深.我做了一点舀!)尽管现在我明白防止指针式铸造static_cast正好是为什么它是更安全和更好的投射方式(可能会调用实现定义的行为或未定义的行为的传统替代方案),我仍然不确定我应该为我的情况做些什么.
我在这里是对OpenGL API函数的调用,其签名是
void glShaderSource(
GLuint shader, GLsizei count, const GLchar **string, const GLint *length
);
Run Code Online (Sandbox Code Playgroud)
我最近更改了文件阅读器API,以便不再将从文件中读取的数据作为a返回,而是char *使用unsigned char *.这种变化没有出错,因为我觉得unsigned char对原始数据的处理能力要好得多(即使它可能是ASCII数据),void *在这方面确实可能更清楚.
然后我当然会把这个指针的地址作为第三个arg传递给glShaderSource.
我认为对我来说安全进行C式演员是安全的GLchar**,事实上这可能是这种情况的标准答案.使用reinterpret_cast只会超越,但不可否认只是少量.
但是我想知道在这种情况下思考过程应该是什么.为什么我能够在这里驳回这些角色的签名?是不是因为我不希望写一个在其任何字符上设置高位的着色器,这意味着我可以投射它?
如果我面临有符号/无符号整数的情况,并且虚假的负整数值被解释为大的正值会有什么可怕的后果呢?我怎样才能在这里编写代码以试图对它"安全"?
我的直觉告诉我,如果没有实现实际执行的代码并且观察数据本身而不是传递指针,这显然是不可能的,所以static_cast在这种情况下是否没有办法重新获得安全性,因为我被迫工作用指针.
您需要使用reinterpret_cast甚至在char *和之间进行转换unsigned char *.(有或没有const).这是因为您将存储为一种类型的位视为不同类型的位; 而是static_cast为了进行价值转换.
正如WhozCraig指出的那样,在char **和之间进行转换unsigned char **实际上是将一个指针作为另一个指针类型(所以,也需要reinterpret_cast).
这在理论上可能都是一个问题,但就实际考虑而言(IMO),你必须付出的努力才能支持所有可能性,这太麻烦了; 对于所有意图和目的,您可以假设别名char为unsigned char与值转换相同的结果,对于两种指针类型也是如此.
| 归档时间: |
|
| 查看次数: |
3020 次 |
| 最近记录: |