编译器,C或C ++(例如,gcc)如何遵循const
声明?
例如,在下面的代码中, 编译器如何跟踪变量ci
是否为const
且无法修改?
int get_foo() { return 42; } void test() { int i = get_foo(); i += 5; const int ci = get_foo(); // ci += 7; // compile error: assignment of read-only variable ?ci? }
与变量的任何其他位符号信息(地址,类型等)非常相似。 通常存在一个符号表,它存储有关已声明标识符的信息,每当遇到对标识符的另一个引用时,都会查询该信息。
(一个更有趣的问题是这些知识是否仅在编译期间或甚至在运行期间出现。大多数语言在编译后丢弃符号表,因此即使标识符被声明为“const”,您也可以操纵编译的代码并强制使用新值。它需要一个复杂的运行时系统(和代码签名)来防止这种情况。)
当然,它是每个编译器的实现,但简而言之,它将变量的const
和volatile
限定符(如果有的话)存储在其变量符号表中,以及其他信息,例如变量的类型以及它是否是指针/参考。
我相信其他人可以详细说明,但简而言之,是的。 编译器跟踪所有类型说明符,以便它知道ci的类型为“const int”,而不是“int”。
编译器知道ci
是const
因为你用线路告诉它
const int ci = get_foo();
当您将ci
传递给其他函数或将其分配给其他函数时,编译器会通过阻止您执行可能会更改其值的任何操作来保留该constine。
例如,以下内容会产生编译器错误。
int *ci2 = &ci; (*ci2)++;
因为编译器不会让你修改ci的值。
正如其他人所说,编译器跟踪const
的方式与编译器跟踪变量为int
的事实相同。 事实上,我已经读过,至少gcc认为const int
是一个与const int
不同的类型,因此它甚至不被跟踪为修饰符,它的跟踪方式与int
完全相同。
请注意,您实际上可以通过指针转换来更改const
的值,但结果是未定义的:
#include #include int main(void) { const int c = 0; printf("%dn", c); ++*(int*)&c; printf("%dn", c); }
在我使用gcc的机器上打印
0 1
但用g ++编译可以得到
需要了解更多c/c++开发分享“const”是如何实现的?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
0 0
以上就是c/c++开发分享“const”是如何实现的?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/979394.html