Aracılığıyla paylaş


Yapıları ve Sınıfları Yorumlama

Sabit değerler gibi davranan ek açıklamalar kullanarak yapı ve sınıf üyelerine açıklama ekleyebilirsiniz; bunlar, kapsayan yapıyı parametre veya sonuç değeri olarak içeren herhangi bir işlev çağrısında veya işlev girişinde/çıkışında doğru kabul edilir.

Yapı ve Sınıf Ek Açıklamaları

  • _Field_range_(low, high)

    Alan, ile arasında (dahil) lowhighbulunur. _Satisfies_(_Curr_ >= low && _Curr_ <= high) Uygun ön koşullar veya gönderi koşulları kullanılarak açıklama eklenen nesneye uygulanana eşdeğerdir.

  • _Field_size_(size), _Field_size_opt_(size), _Field_size_bytes_(size), _Field_size_bytes_opt_(size)

    tarafından sizebelirtilen öğelerde (veya baytlarda) yazılabilir boyuta sahip bir alan.

  • _Field_size_part_(size, count), _Field_size_part_opt_(size, count), _Field_size_bytes_part_(size, count), _Field_size_bytes_part_opt_(size, count)

    tarafından sizebelirtilen öğelerde (veya baytlarda) yazılabilir boyuta ve count okunabilir olan bu öğelerin (bayt) değerine sahip bir alan.

  • _Field_size_full_(size), _Field_size_full_opt_(size), _Field_size_bytes_full_(size), _Field_size_bytes_full_opt_(size)

    tarafından sizebelirtilen öğelerde (veya baytlarda) hem okunabilir hem de yazılabilir boyuta sahip bir alan.

  • _Field_z_

    Null olarak sonlandırılan dizeye sahip bir alan.

  • _Struct_size_bytes_(size)

    Yapı veya sınıf bildirimi için geçerlidir. Bu türdeki geçerli bir nesnenin, tarafından sizebelirtilen bayt sayısıyla bildirilen türden büyük olabileceğini gösterir. Örnek:

    
    typedef _Struct_size_bytes_(nSize)
    struct MyStruct {
        size_t nSize;
        ...
    };
    
    

    Daha sonra türdeki MyStruct * bir parametrenin pM bayt cinsinden arabellek boyutu şu şekilde alınır:

    min(pM->nSize, sizeof(MyStruct))
    

Örnek

#include <sal.h>

// This _Struct_size_bytes_ is equivalent to what below _Field_size_ means.
_Struct_size_bytes_(__builtin_offsetof(MyBuffer, buffer) + bufferSize * sizeof(int))
struct MyBuffer
{
    static int MaxBufferSize;

    _Field_z_
    const char* name;

    int firstField;

    // ... other fields

    _Field_range_(1, MaxBufferSize)
    int bufferSize;

    _Field_size_(bufferSize)        // Preferred way - easier to read and maintain.
    int buffer[]; // Using C99 Flexible array member
};

Bu örnek için notlar:

  • _Field_z_ eşdeğeri, _Null_terminated_ olur. _Field_z_ ad alanı için ad alanının null olarak sonlandırılan bir dize olduğunu belirtir.
  • _Field_range_ için bufferSize değerinin bufferSize 1 ve MaxBufferSize (ikisi de dahil) içinde olması gerektiğini belirtir.
  • ve _Field_size_ ek açıklamalarının _Struct_size_bytes_ bitiş sonuçları eşdeğerdir. Benzer bir düzene sahip yapılar veya sınıflar için, _Field_size_ eşdeğer _Struct_size_bytes_ ek açıklamaya göre daha az başvuru ve hesaplamaya sahip olduğundan okuması ve bakımı daha kolaydır. _Field_size_ bayt boyutuna dönüştürme gerektirmez. Bayt boyutu tek seçenekse, örneğin geçersiz işaretçi alanı _Field_size_bytes_ için kullanılabilir. Hem hem de _Struct_size_bytes__Field_size_ varsa, her ikisi de araçlar tarafından kullanılabilir. İki ek açıklamanın aynı fikirde olmadığı durumda yapılması gerekenler aralığa bağlı.

Ayrıca bkz.