簡體   English   中英

在C中,如何將結構的成員聲明為volatile?

[英]In C, how do you declare the members of a structure as volatile?

如何將結構的特定成員聲明為volatile?

與非struct字段完全相同:

#include <stdio.h>
int main (int c, char *v[]) {
    struct _a {
        int a1;
        volatile int a2;
        int a3;
    } a;
    a.a1 = 1;
    a.a2 = 2;
    a.a3 = 3;
    return 0;
}

您可以使用"volatile struct _a {...}"將整個struct標記為volatile,但上面的方法適用於各個字段。

根據這篇文章應該很直接:

最后,如果將volatile應用於struct或union,則struct / union的整個內容都是volatile。 如果您不想要此行為,可以將volatile限定符應用於struct / union的各個成員。

我需要澄清C / C ++的volatile,因為這里有一個錯誤的答案。 自1994年以來,我一直在編寫微控制器,這個關鍵字非常有用並經常需要。

volatile永遠不會破壞你的代碼,使用它永遠不會有風險。 關鍵字基本上確保編譯器不優化變量。 如果過度使用此關鍵字,最糟糕的情況是您的程序會更大更慢。

這里是你需要一個變量的關鍵字: - 你有一個寫入中斷函數內的變量。 AND - 將相同的變量讀取或寫入外部中斷函數。 或者如果您有2個使用該變量的不同優先級的中斷函數,那么您還應該使用'volatile'。

否則,不需要關鍵字。

至於硬件寄存器,如果你不在你的程序中做奇怪的事情,即使沒有關鍵字也應該將它們視為易失性。

我剛剛完成了一個數據結構,其中很明顯需要使用volatile限定符,但原因與上述原因不同:這只是因為結構需要強大的鎖定機制,因為(i)直接訪問(ii) )等效調用


直接訪問 處理持續的RAM讀寫。

等效調用 處理可互換的方法流。


除非編譯器知道如何處理它,否則我對這個關鍵字沒有太多好運。 這是我個人的經歷。 但我有興趣研究它如何直接影響跨平台編譯,例如低級系統調用和后端數據庫之間的編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM