Aracılığıyla paylaş


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 volatiletür niteleyicileri bildirimde constrestrictyalnı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 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. anahtar const sözcüğü, işlevin işaretçiyi const 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, 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 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 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 sunulan ve veya /std:c17modunda 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 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;
};

Ayrıca bkz.

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