類型限定詞
類型限定詞會提供兩個屬性的其中一個給識別項。 類型 const
限定詞會將物件宣告為不可修改。
volatile
類型限定詞會宣告一個項目,其值可由超出項目所在程式之控制範圍的項目 (例如同時執行的執行緒) 合法變更。
型別限定詞 const
、 restrict
和 volatile
只能出現在宣告中一次。 類型限定詞可以與任何類型規範一起顯示;不過,它們不能出現在多個專案宣告中的第一個逗號之後。 例如,下列宣告是合法的:
typedef volatile int VI;
const int ci;
這些宣告不合法:
typedef int *i, volatile *vi;
float f, const cf;
類型限定詞只有在存取做為運算式中左值的識別項時才相關。 如需有關左值和運算式的詳細資訊,請參閱左值和右值運算式。
語法
type-qualifier
:
const
restrict
volatile
const
和 volatile
以下是合法 const
和 volatile
宣告:
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
如果陣列類型的規格包括類型限定詞,則元素為限定,而不是陣列類型。 如果函式類型的規格包含限定詞,則行為會是未定義。
volatile
和 const
不會影響物件的值或算術屬性範圍。
關鍵字
const
可用來修改任何基本或匯總型別,或是任何型別之物件的指標,或typedef
。 如果專案只const
以類型限定詞宣告,則會將其類型視為 const int。const
變數可以初始化,也可以放在儲存體的唯讀區域中。 關鍵字const
對於宣告 指標const
很有用,因為這需要函式不要以任何方式變更指標。編譯器會假設,
volatile
變數可在程式中的任何一點供使用或修改其值的未知處理序存取。 不論命令列上指定的優化為何,都必須產生變數的每個指派或參考volatile
的程式碼,即使它似乎沒有作用也一樣。
如果單獨使用 volatile
,則會假設為 int
。
volatile
類型指定名稱可以用來提供可靠的特殊記憶體位置存取。 使用 volatile
搭配可供訊號處理常式、同時執行的程式或特殊硬體 (例如,記憶體對應的 I/O 控制暫存器) 存取或修改的資料物件。 您可以將變數的存留期宣告為 volatile
,或是將單一參考轉型為 volatile
。
- 專案可以是
const
和volatile
,在此情況下,專案無法由自己的程式合法修改,但可由某些非同步程式修改。
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;
};