我在c ++中有非常简单的代码.当我在Visual Studio下编译时,会发生错误.
#include <stdint.h>
#include <time.h>
void func1(const uint8_t* data)
{
}
void func2(const uint8_t** data)
{
}
int main()
{
uint8_t* data1 = NULL;
uint8_t** data2 = NULL;
func1(data1);//OK
func2(data2);//error C2664: cannot convert argument 1 from 'uint8_t **' to 'const uint8_t **'
}
Run Code Online (Sandbox Code Playgroud)
完整的错误消息是:
错误C2664:'void func2(const uint8_t**)':无法将参数1从'uint8_t**'转换为'const uint8_t**'
Usualy你不能将const XXX转换为XXX,但是从XXX到const XXX应该没问题,为什么会出现这个错误?
但从XXX到const XXX应该没问题
不,在这个具体的例子中这不可行.考虑:
int const x = 10; // implementation stores to read-only memory
// implementation crashes on writes to read-only memory
void foo(int const **ptr) {
*ptr = &x;
}
int main() {
int *p;
foo(&p);
*p = 12; // crash
}
Run Code Online (Sandbox Code Playgroud)
如果这是合法的,它会将'指向const'值的指针赋给'指向非const'对象的指针,因此可以对常量对象进行危险的写入.
为了转换为const,可以将const添加到上面添加最低const的类型中的每个级别(除了最顶层).
例如,它不容许用户转换int ******
到int ***const***
,但它是好将其转换为int ***const*const*const*
.这也适用于volatile
:您可以转换int ******
为int ***volatile*const*const*
但不能转换int ***volatile***
类型系统中的这个规则保护我们不会错误地将const对象视为非常量,或者将volatile对象视为非易失性,如果我们真的想犯这个错误,那么我们必须使用const_cast
.
foo(const_cast<int const **>(&p));
*p = 12; // crash
Run Code Online (Sandbox Code Playgroud)
使用const转换程序很好,编译器很乐意生成一个展示未定义行为的可执行文件.(实例)
修复foo()
以允许它获取指向非const的指针:
void foo(int const * const *ptr) {
*ptr = &x; // error, can't modify *ptr
}
foo(&p); // conversion works fine
Run Code Online (Sandbox Code Playgroud)
防止foo()
将'const'值的指针写入'指向非const'对象的指针.(实例)
您可能认为XXX到const XXX是可以的,因为最常见的情况,即使用单级指针:int *
- > int const *
,是可以的并且也遵守上述转换规则.const
在最高级别无关紧要,因为参数本身的更改不会逃避该功能.
这是您的两个选择,这...
void func1(const uint8_t* data)
{
}
void func2(const uint8_t** data)
{
}
int main()
{
const uint8_t* data1 = NULL;
const uint8_t** data2 = NULL;
func1(data1);
func2(data2);
}
Run Code Online (Sandbox Code Playgroud)
或这个...
void func1(uint8_t* data)
{
}
void func2(uint8_t** data)
{
}
int main()
{
uint8_t* data1 = NULL;
uint8_t** data2 = NULL;
func1(data1);
func2(data2);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2795 次 |
最近记录: |