c-在激活-Wall时,是否可以在不带const限定符的函数中返回const指针参数的地址而不带警告



好吧,问题主要在上面。我唯一能补充的是,我已经尝试了str+i&(str[i]),它们都给了我discards 'const' qualifier from pointer target type警告。

或者有没有其他方法可以在没有警告的情况下类似strstrstrchr(它们的C版本中都没有常量限定符(?

使用强制转换告诉编译器您的转换是有意的:

char *foo(const char *p)
{
return (char *) p;
}

注意:根据C 2018 6.3.2.3:,删除限定符的转换是由C标准定义的,当它们将指针转换回原来的类型时

指向对象类型的指针可以转换为指向不同对象类型的指示器。如果结果指针没有正确对齐引用的类型,则行为是未定义的。否则,当再次转换回时,结果应与原始指针进行比较…

因此,如果某个char *指针x已转换为const char *x,则将其转换回char *将产生原始值。

如果指针最初不是不合格的,那么将其转换为不合格类型通常不是完全由C标准定义的。标准告诉我们可以将结果转换回其原始类型以获得原始值,但它并没有告诉我们可以将该结果用于其他用途。例如:

const int i;
const int *x = &i;  // Defined, x points to i.
int *p = (int *) x; // Defined, p is a pointer that can be converted back to "const int *".
printf("%dn", *p); // Not defined, value of p is not defined for “normal” use.
const int *y = p;   // Defined, produces y such that y == x and y == &i.

相关内容

  • 没有找到相关文章