Delen via


Aantekeningen toevoegen aan Structs en klassen

U kunt aantekeningen maken voor struct- en klasseleden door aantekeningen te gebruiken die fungeren als invarianten - ze worden verondersteld waar te zijn bij elke functieaanroep of functietoegang/-uitgang waarbij de omliggende structuur betrokken is als parameter of als resultaatwaarde.

Struct- en klasseaantekeningen

  • _Field_range_(low, high)

    Het veld bevindt zich in het bereik (inclusief) van low tot high. Equivalent aan _Satisfies_(_Curr_ >= low && _Curr_ <= high) toegepast op het geannoteerde object met behulp van de juiste pre- of postvoorwaarden.

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

    Een veld met een schrijfbare grootte in elementen (of bytes) zoals opgegeven door size.

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

    Een veld met een schrijfbare grootte in elementen (of bytes) zoals opgegeven door size, en de count elementen (bytes) die leesbaar zijn.

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

    Een veld met zowel leesbare als schrijfbare grootte in elementen (of bytes) zoals opgegeven door size.

  • _Field_z_

    Een veld met een door null beƫindigde tekenreeks.

  • _Struct_size_bytes_(size)

    Van toepassing op struct- of klassedeclaratie. Geeft aan dat een geldig object van dat type mogelijk groter kan zijn dan het gedeclareerde type, waarbij het aantal bytes wordt gespecificeerd door size. Voorbeeld:

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

    De buffergrootte in bytes van een parameter pM van het type MyStruct * wordt vervolgens als volgt beschouwd:

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

Voorbeeld

#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
};

Opmerkingen voor dit voorbeeld:

  • _Field_z_ is equivalent aan _Null_terminated_. _Field_z_ voor het naamveld geeft aan dat het naamveld een null-beĆ«indigde tekenreeks is.
  • _Field_range_ geeft bufferSize aan dat de waarde van bufferSize tussen 1 en MaxBufferSize inclusief beide moet zijn.
  • De eindresultaten van de _Struct_size_bytes_ en _Field_size_ aantekeningen zijn gelijkwaardig. Voor structuren of klassen met een vergelijkbare indeling is het gemakkelijker te lezen en te onderhouden, _Field_size_ omdat deze minder verwijzingen en berekeningen heeft dan de equivalente _Struct_size_bytes_ aantekening. _Field_size_ vereist geen conversie naar de bytegrootte. Als bytegrootte de enige optie is, bijvoorbeeld voor een veld met ongeldige aanwijzer, _Field_size_bytes_ kan worden gebruikt. Als _Struct_size_bytes_ en _Field_size_ allebei bestaan, zijn ze beschikbaar voor hulpprogramma's. Het is aan de tool wat te doen als de twee aantekeningen het niet eens zijn.

Zie ook