C修改寄存器const char *

时间:2014-08-07 08:32:04

标签: c++ c

我想知道为什么你可以修改一个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?

3 个答案:

答案 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而不是指针。