Share via


Tür Niteleyicileri

Tür niteleyicileri bir tanımlayıcıya iki özelliknden birini verir. Tür const niteleyicisi bir nesneyi değiştirilemez olarak bildirir. Tür niteleyicisi volatile , değeri göründüğü programın denetiminin dışında bir şey tarafından yasal olarak değiştirilebilen bir öğeyi (eşzamanlı olarak yürütülen bir iş parçacığı gibi) bildirir.

, ve volatiletür niteleyicileri, restrictconstbildirimde yalnızca bir kez görüntülenebilir. Tür belirleyicileri herhangi bir tür tanımlayıcısıyla birlikte görünebilir; ancak, birden çok öğe bildirimindeki 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.

Syntax

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ü ya da herhangi bir türdeki bir nesnenin işaretçisini ya da bir typedeföğesini değiştirmek için kullanılabilir. Bir öğe yalnızca tür niteleyicisi const ile bildirilirse, türü const int olarak alınır. Bir const değişken başlatılabilir veya depolamanın salt okunur bir bölgesine yerleştirilebilir. işlevinin const işaretçiyi const hiçbir şekilde değiştirmemesi gerektiğinden, anahtar sözcüğü işaretçileri bildirmek için yararlı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, bir volatile 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 tanımlayıcısı volatile , ö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, programları eşzamanlı olarak yürüten veya bellek eşlemeli G/Ç denetim kayıtları gibi özel donanımlar tarafından kullanılabilen veri nesneleriyle 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 volatilede const 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 tanıtılan ve veya /std:c17modunda kullanılabilen/std:c11 tür niteleyicisi, işaretçi bildirimlerine uygulanabilir. İşaretçiyi niteler, işaret ettiğinden değil.

restrict , geçerli kapsamdaki başka hiçbir işaretçinin aynı bellek konumuna başvurduğunu 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 işaretlenmiş bir işaretçiyi diğer adla restrictişaretlerseniz 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;
};

Ayrıca bkz.

/std (Dil Standart Sürümünü Belirtin)
Bildirimler ve Türler