我知道挥发性调节剂已经被讨论了很多。请不要对我大喊大叫。我知道为什么要使用它,但我正在尝试在使用visual studio 2008和2010的多线程c程序中正确使用它。在Windows 10上遇到了一些问题。在一个简单的声明中把修饰符放在哪里有关系吗?例如,这两个版本都成功构建,但我想知道编译器的含义是否有任何不同:

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

更复杂的声明呢?鉴于这种结构:
typedef struct _KEY_HANDLE
{
    ULONG handle;
    void *ptr;
} KEY_HANDLE;
...
// difference if any between these three
volatile KEY_HANDLE * key_handles = NULL;
KEY_HANDLE volatile * key_handles = NULL;
KEY_HANDLE * volatile key_handles = NULL;
...
key_handles = (PVOID) malloc(bufsz);
...

谢谢。

最佳答案

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

关于c - 在C程序(Visual Studio)中正确放置volatile修饰符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53713394/

10-11 18:09