为什么以下代码会给我一个"丢弃限定符"警告?
double* const a[7];
memcpy(a,b,sizeof(double*)*7);
Run Code Online (Sandbox Code Playgroud)
我使用Apple LLVM版本6.1.0(clang-602.0.53)(基于LLVM 3.6.0svn)获得的错误是
warning: passing 'double *const [7]' to parameter of type 'void *' discards qualifiers
Run Code Online (Sandbox Code Playgroud)
编辑:
奖金问题.为什么restrict关键字也不起作用?
double* restrict a[7];
memcpy(a,b,sizeof(double*)*7);
Run Code Online (Sandbox Code Playgroud)
编辑2:
我问这个问题,因为我想a成为一个const restrict指针.我可以使用以下代码获得此结果:
double* const restrict a[7] = {b[0], b[2], ... b[7]};
Run Code Online (Sandbox Code Playgroud)
这是一件愚蠢的事吗?
您正在尝试将const指针传递给期望非const指针的函数.
编辑:
更具体地说,a是一个数组,其内容是const指向双精度的指针.如果您尝试这样做a[0] = b[0](假设b被定义为double *b[7]或类似的东西),您将收到编译器错误.如果您有const char a[7]并且尝试过,结果将是相同的a[0] = 'x'.
memcpy按照您的方式呼叫可以有效地执行上面禁止操作的操作.
在这种情况下restrict,它告诉编译器给定指针指向的内存只能由给定的指针寻址.这允许编译器执行某些优化.
来自维基百科:
它表示在指针的生命周期中,只有它或直接从它派生的值(例如指针+ 1)才能用于访问它指向的对象.
因为memcpy不期望restrict *失去保证,这就是你得到警告的原因.通常,绕过restrict这样会导致不可预测的行为.