为什么我接到以下foo调用警告(gcc 42.2)?
void foo(const char **str)
{
(*str)++;
}
(...)
char **str;
foo(str);
(...)
Run Code Online (Sandbox Code Playgroud)
我明白了为什么我们不能称之为一个以外的功能char **有const char **,但相反似乎确定我,为什么下面的警告?
warning: passing argument 1 of 'foo' from incompatible pointer type
Run Code Online (Sandbox Code Playgroud)
这是错误的.这里没有与编译器争论的真正空间,因为规范支持它.这是一个例子,它解释了为什么它是错误的:
void func(const char **p)
{
*p = "abc";
}
void func2(void)
{
char *a;
func(&a);
*a = 'x';
}
Run Code Online (Sandbox Code Playgroud)
如果编译器没有吐出错误,你的程序可能会崩溃,因为你要覆盖一个字符串文字(通常在内存中标记为只读).
所以你不能隐式地转换char **为const char **因为它允许你const从任何值中删除限定符 - 基本上,它允许你const在没有显式强制转换的情况下随意忽略.
编译器发出警告而不是错误的主要原因是因为许多旧代码不使用const限定符,如果代码是今天编写的.
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |