Tür Niteleyicileri
Tür niteleyicileri bir tanımlayıcıya iki özelliğinden birini verir. Tür const
niteleyicisi bir nesneyi değiştirilemez olarak bildirir. Tür niteleyicisi volatile
, değeri, göründüğü programın denetimi dışında bir şey tarafından (eşzamanlı olarak yürütülen iş parçacığı gibi) yasal olarak değiştirilebilen bir öğeyi bildirir.
, ve volatile
tür niteleyicileri bildirimde const
restrict
yalnızca bir kez görünebilir. Tür belirleyicileri herhangi bir tür tanımlayıcısıyla birlikte görünebilir; ancak, birden çok öğe bildiriminde ilk virgülden sonra görünemezler. Örneğin, aşağıdaki bildirimler yasaldır:
typedef volatile int VI;
const int ci;
Bu bildirimler yasal değildir:
typedef int *i, volatile *vi;
float f, const cf;
Tür niteleyicileri yalnızca ifadelerde l değerleri olarak tanımlayıcılara erişirken geçerlidir. l-değerleri ve ifadeleri hakkında bilgi için bkz. L-Value ve R-Value Expressions.
Sözdizimi
type-qualifier
:
const
restrict
volatile
const
ve volatile
Yasal ve volatile
bildirimler şunlardırconst
:
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
Bir dizi türünün belirtimi tür niteleyicileri içeriyorsa, öğe dizi türü değil nitelenmiş olur. İşlev türünün belirtimi niteleyiciler içeriyorsa, davranış tanımlanmamıştır. volatile
ve const
nesnenin değer aralığını veya aritmetik özelliklerini etkilemez.
anahtar
const
sözcüğü herhangi bir temel veya toplama türünü değiştirmek için ya da herhangi bir türdeki bir nesnenin işaretçisini ya da birtypedef
öğesini değiştirmek için kullanılabilir. Bir öğe yalnızca tür niteleyicisiconst
ile bildirilirse, türü const int olarak alınır. Birconst
değişken başlatılabilir veya depolamanın salt okunur bir bölgesine yerleştirilebilir. anahtarconst
sözcüğü, işlevin işaretçiyiconst
herhangi bir şekilde değiştirmemesi gerektiğinden işaretçileri bildirmek için kullanışlıdır.Derleyici, programın herhangi bir noktasında, değerini kullanan veya değiştiren bilinmeyen bir işlem tarafından bir
volatile
değişkene erişilebileceğini varsayar. Komut satırında belirtilen iyileştirmelerden bağımsız olarak, birvolatile
değişkenin her atamasının veya başvurusunun kodu, hiçbir etkisi yokmuş gibi görünse bile oluşturulmalıdır.
Tek başına kullanılırsa volatile
varsayılır int
. Tür volatile
belirtici, özel bellek konumlarına güvenilir erişim sağlamak için kullanılabilir. Sinyal işleyicileri tarafından erişilebilen veya değiştirilebilen veri nesneleriyle, programları eşzamanlı olarak yürüterek veya bellekle eşlenen G/Ç denetim yazmaçları gibi özel donanımlarla kullanın volatile
. Bir değişkeni yaşam süresi olarak volatile
bildirebilir veya tek bir başvuru olarak volatile
atayabilirsiniz.
- Bir öğe hem hem
volatile
deconst
olabilir, bu durumda öğe kendi programı tarafından meşru olarak değiştirilemez, ancak zaman uyumsuz bir işlem tarafından değiştirilebilir.
restrict
restrict
C99'da sunulan ve veya /std:c17
modunda kullanılabilen /std:c11
tür niteleyicisi, işaretçi bildirimlerine uygulanabilir. İşaretçiyi niteler, işaret edeni değil.
restrict
, geçerli kapsamdaki başka hiçbir işaretçinin aynı bellek konumuna başvurduğu derleyiciye yönelik bir iyileştirme ipucudur. Başka bir ifadeyle, işaretçinin ömrü boyunca nesneye erişmek için yalnızca işaretçi veya ondan türetilen bir değer (işaretçi + 1 gibi) kullanılır. Bu, derleyicinin daha iyileştirilmiş kod üretmesine yardımcı olur. C++ eşdeğer bir mekanizmaya sahiptir, __restrict
Bunun, siz ve derleyici arasındaki bir sözleşme olduğunu restrict
unutmayın. ile restrict
işaretlenmiş bir işaretçinin diğer adını yaparsanız sonuç tanımlanmamış olur.
Aşağıda, kullanan bir örnek verilmişti 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;
};