在C程序中正确放置volatile修饰符(Visual Studio)

时间:2018-12-10 20:46:16

标签: c windows visual-studio-2010 visual-studio-2008 volatile

我知道 volatile 修饰符已经讨论了很多。请不要对我大喊。我知道为什么使用它,但是我正在尝试使用Visual Studio 2008和2010在我的多线程C程序中正确使用它。在Windows 10上遇到了麻烦。将修饰符放在简单声明中的位置有什么关系? ?例如,这两种方法都可以成功构建,但是我想知道编译器的含义是否存在任何差异:

df['d'] = df.a.sub(df.b).cumsum().add(df.c.iloc[0])

df.loc[1:,'c'] = df.d.shift()

>>> df
   a  b      c      d
0  7  4  100.0  103.0
1  2  5  103.0  100.0
2  3  6  100.0   97.0

更复杂的声明呢?鉴于此结构:

// difference if any between these two?
volatile char _initialized = 0;
char volatile _initialized = 0;

谢谢。

2 个答案:

答案 0 :(得分:2)

https://barrgroup.com/Embedded-Systems/How-To/C-Volatile-Keyword

根据此链接,前两个字符都相同。

同样,两个KEY_HANDLE指针是指向易失性KEY_HANDLE的指针,而第三个是指向非易失性HEY_HANDLE的易失性指针。

volatile KEY_HANDLE * key_handles = NULL;  //pointer to a volatile KEY_HANDLE
KEY_HANDLE volatile * key_handles = NULL;  //pointer to a volatile KEY_HANDLE
KEY_HANDLE * volatile key_handles = NULL;  //volatile pointer to a non-volatile KEY_HANDLE

答案 1 :(得分:1)

对于基本类型:

volatile unit32_t *number; //The number pointed at is volatile
uint32_t *volatile number; //The pointer is volatile
volatile uint32_t number; //The number is volatile

对于结构:

volatile struct_t *struct_p; //The members of the struct pointed at are volatile
struct_t *volatile struct_p; //The pointer is volatile
volatile struct_t struct_o; //The members of the struct are volatile

这些当然可以合并:

volatile uint32_t *volatile number; //Both the pointer and the number are volatile

希望现在您可以看到volatile修饰符根据位置执行的模式。

我没有像这样使用volatile:

uint32_t volatile number; //I assume it will mean that the number is volatile
uint32_t volatile *number; //I assume it will mean that the number is volatile

经验法则是,如果volatile修饰符位于*(指针)的后面,它将修改指针而不是指针变量。

对于volatile它本身的含义,基本上意味着编译器无法假设变量中可能存储哪些数据,因此无法优化对变量的任何操作。