use*_*501 24 c c++ arrays embedded volatile
在C中使用volatile关键字来防止编译器对变量执行某些优化以及其他细微更改.
例如;
volatile int my_int = 0;
Run Code Online (Sandbox Code Playgroud)
创建一个整数.在某些情况下,它可能会阻止以下优化:
while(my_int == 0); // Loop until my_int != 0
Run Code Online (Sandbox Code Playgroud)
优化到:
while(1); // Loop infinity.
Run Code Online (Sandbox Code Playgroud)
这对于包括嵌入式系统中经常遇到的情况很有用,例如可以通过中断函数调用对变量进行修改的情况.还有许多其他这种技术有用的例子.my_int
可以是由这种功能修改的标志.(这只是一个玩具模型.)
但是,请考虑函数修改的数据是数组的情况.数据可以由指针指向.
unsigned char* my_data = new unsigned char[256];
Run Code Online (Sandbox Code Playgroud)
在这种情况下,考虑到是my_data在这个问题上的该特定情况的全局变量[1],是volatile
关键字冗余的,或者它仍需要?
[1]可能无关紧要.
如果答案是需要volatile关键字,那么使用正确的语法是什么?
例如,volatile unsigned char* my_data
我假设声明指针本身是易失性的,而不是它指向的数据.
最后,C和C++的使用有区别吗?
Fil*_*ves 30
是的,volatile
是必需的,正确的声明是:
volatile unsigned char *my_data;
Run Code Online (Sandbox Code Playgroud)
这声明my_data
是指向volatile unsigned char的指针.
要使指针本身易变,你需要这样做:
unsigned char *volatile my_data;
Run Code Online (Sandbox Code Playgroud)
当然,指针和指向数据都可能是易失性的:
volatile unsigned char *volatile my_data;
Run Code Online (Sandbox Code Playgroud)
C和C++之间没有区别.