Anotar structs y clases

Puede anotar miembros de estructura y clase mediante anotaciones que actúan como invariables; se supone que son true en cualquier llamada a función o entrada o salida de función que implique la estructura de cierre como un parámetro o un valor de resultado.

Anotaciones de estructura y clase

  • _Field_range_(low, high)

    El campo está en el intervalo (inclusivo) de low a high . Equivalente a _Satisfies_(_Curr_ >= low && _Curr_ <= high) aplicado al objeto anotado mediante las condiciones previas o posteriores adecuadas.

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

    Campo que tiene un tamaño grabable en elementos (o bytes) especificado por 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)

    Campo que tiene un tamaño grabable en elementos (o bytes) especificado por , y el de los elementos sizecount (bytes) que son legibles.

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

    Campo que tiene un tamaño legible y grabable en elementos (o bytes) según lo especificado por size .

  • _Field_z_

    Campo que tiene una cadena terminada en NULL.

  • _Struct_size_bytes_(size)

    Se aplica a la declaración de estructura o clase. Indica que un objeto válido de ese tipo puede ser mayor que el tipo declarado, con el número de bytes especificado por size . Por ejemplo:

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

    El tamaño del búfer en bytes de un parámetro pM de tipo se toma MyStruct * como:

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

Ejemplo

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

Notas de este ejemplo:

  • _Field_z_ equivale a _Null_terminated_. _Field_z_ para el campo name especifica que el campo name es una cadena terminada en NULL.
  • _Field_range_ para bufferSize especifica que el valor de debe estar dentro de bufferSize 1 y MaxBufferSize (ambos inclusive).
  • Los resultados finales de _Struct_size_bytes_ las anotaciones y son _Field_size_ equivalentes. Para las estructuras o clases que tienen un diseño similar, es más fácil de leer y mantener, ya que tiene menos referencias y cálculos que _Field_size_ la anotación _Struct_size_bytes_ equivalente. _Field_size_ no requiere la conversión al tamaño de bytes. Si el tamaño de bytes es la única opción, por ejemplo, para un campo de puntero void, _Field_size_bytes_ se puede usar. Si existen _Struct_size_bytes_ y _Field_size_ , ambas estarán disponibles para las herramientas. Es la herramienta la que debe hacer si las dos anotaciones no están de acuerdo.

Vea también