Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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 consttür niteleyicileri bildirimde restrictvolatileyalnı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 const bildirimler şunlardırvolatile:
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
constsö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 niteleyicisiconstile bildirilirse, türü const int olarak alınır. Birconstdeğişken başlatılabilir veya depolamanın salt okunur bir bölgesine yerleştirilebilir. anahtarconstsözcüğü, işlevin işaretçiyiconstherhangi 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
volatiledeğişkene erişilebileceğini varsayar. Komut satırında belirtilen iyileştirmelerden bağımsız olarak, birvolatiledeğ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 volatileatayabilirsiniz.
- Bir öğe hem hem
constdevolatileolabilir, 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 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 restrictiş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;
};