Share via


類型限定詞

類型限定詞會提供兩個屬性的其中一個給識別項。 類型 const 限定詞會將物件宣告為不可修改。 volatile 類型限定詞會宣告一個項目,其值可由超出項目所在程式之控制範圍的項目 (例如同時執行的執行緒) 合法變更。

型別限定詞 constrestrictvolatile 只能出現在宣告中一次。 類型限定詞可以與任何類型規範一起顯示;不過,它們不能出現在多個專案宣告中的第一個逗號之後。 例如,下列宣告是合法的:

typedef volatile int VI;
const int ci;

這些宣告不合法:

typedef int *i, volatile *vi;
float f, const cf;

類型限定詞只有在存取做為運算式中左值的識別項時才相關。 如需有關左值和運算式的詳細資訊,請參閱左值和右值運算式

語法

type-qualifier:
const
restrict
volatile

constvolatile

以下是合法 constvolatile 宣告:

int const *p_ci;      // Pointer to constant int
int const (*p_ci);   // Pointer to constant int
int *const cp_i;     // Constant pointer to int
int (*const cp_i);   // Constant pointer to int
int volatile vint;     // Volatile integer

如果陣列類型的規格包括類型限定詞,則元素為限定,而不是陣列類型。 如果函式類型的規格包含限定詞,則行為會是未定義。 volatileconst 不會影響物件的值或算術屬性範圍。

  • 關鍵字 const 可用來修改任何基本或匯總型別,或是任何型別之物件的指標,或 typedef 。 如果專案只 const 以類型限定詞宣告,則會將其類型視為 const intconst 變數可以初始化,也可以放在儲存體的唯讀區域中。 關鍵字 const 對於宣告 指標 const 很有用,因為這需要函式不要以任何方式變更指標。

  • 編譯器會假設,volatile 變數可在程式中的任何一點供使用或修改其值的未知處理序存取。 不論命令列上指定的優化為何,都必須產生變數的每個指派或參考 volatile 的程式碼,即使它似乎沒有作用也一樣。

如果單獨使用 volatile,則會假設為 intvolatile 類型指定名稱可以用來提供可靠的特殊記憶體位置存取。 使用 volatile 搭配可供訊號處理常式、同時執行的程式或特殊硬體 (例如,記憶體對應的 I/O 控制暫存器) 存取或修改的資料物件。 您可以將變數的存留期宣告為 volatile,或是將單一參考轉型為 volatile

  • 專案可以是 constvolatile ,在此情況下,專案無法由自己的程式合法修改,但可由某些非同步程式修改。

restrict

restrict C99 中引進且可在/std:c17 模式中使用的 /std:c11類型限定詞,可以套用至指標宣告。 它會限定指標,而不是指標所指向的內容。

restrict 是編譯器的優化提示,目前範圍中沒有其他指標參考相同的記憶體位置。 也就是說,只有在指標或衍生自它的值 (例如指標 + 1) ,才會用來存取指標存留期中的物件。 這有助於編譯器產生更優化的程式碼。 C++ 具有相等的機制, __restrict

請記住, restrict 這是您與編譯器之間的合約。 如果您將標示為 的 restrict 指標加上別名,則結果為未定義。

以下是使用 restrict 的範例:

void test(int* restrict first, int* restrict second, int* val)
{
    *first += *val;
    *second += *val;
}

int main()
{
    int i = 1, j = 2, k = 3;
    test(&i, &j, &k);

    return 0;
}

// Marking union members restrict tells the compiler that
// only z.x or z.y will be accessed in any scope, which allows
// the compiler to optimize access to the members.
union z 
{
    int* restrict x;
    double* restrict y;
};

另請參閱

/std (指定語言標準版本)
宣告和類型