我想知道为什么你可以修改一个const变量,如果它存储在一个寄存器中,虽然它可以在一些非常广泛使用的代码中看到,例如(来自http://www.opensource.apple.com/source/Libc/Libc-167/gen.subproj/i386.subproj/strlen.c ):
size_t
strlen(str)
const char *str;
{
register const char *s;
for (s = str; *s; ++s);
return(s - str);
}
它在gcc和clang上没有警告或错误编译。
是否有任何特殊原因允许您修改它,即使它是常量?
是否有任何其他允许修改我应该注意的const的情况(没有特别用于修改const的丑陋演员)?
有没有理由为什么这个例子选择将变量限定为const?
答案 0 :(得分:6)
以下声明:
register const char *s;
并不意味着指针本身应该是只读的,但它只会影响它可能指向的char
个对象。以下循环不会修改*s
,而只会修改指针本身(换句话说,值是安全的)。
for (s = str; *s; ++s)
;
请注意,该示例使用旧式函数声明,这在现代C中不推荐,同样register
存储类并不意味着,该值实际存储在CPU寄存器中,它只是提示 for compiler(可以忽略)。
如果你想保护指针本身,那么正确的声明是:
register char * const s;
如果要使用以下声明保护引用的值和指针,则可以合并:
register const char * const s;
答案 1 :(得分:3)
我认为它是不变的,它不是指针,而是指向字符。
答案 2 :(得分:0)
这是因为const被引用指向的char而不是指针。