## Appendix D Attributes in Declarations ¶

You can specify certain additional requirements in a declaration, to get fine-grained control over code generation, and helpful informational messages during compilation. We use a few attributes in code examples throughout this manual, including

`aligned`

  The `aligned` attribute specifies a minimum alignment for a variable or structure field, measured in bytes:

      int foo __attribute__ ((aligned (8))) = 0;

  This directs GNU C to allocate `foo` at an address that is a multiple of 8 bytes. However, you can’t force an alignment bigger than the computer’s maximum meaningful alignment.

`packed`

  The `packed` attribute specifies to compact the fields of a structure by not leaving gaps between fields. For example,

      struct __attribute__ ((packed)) bar
      {
        char a;
        int b;
      };

  allocates the integer field `b` at byte 1 in the structure, immediately after the character field `a`. The packed structure is just 5 bytes long (assuming `int` is 4 bytes) and its alignment is 1, that of `char`.

`deprecated`

  Applicable to both variables and functions, the `deprecated` attribute tells the compiler to issue a warning if the variable or function is ever used in the source file.

      int old_foo __attribute__ ((deprecated));

      int old_quux () __attribute__ ((deprecated));

`__noinline__`

  The `__noinline__` attribute, in a function’s declaration or definition, specifies never to inline calls to that function. All calls to that function, in a compilation unit where it has this attribute, will be compiled to invoke the separately compiled function. See Inline Function Definitions.

`__noclone__`

  The `__noclone__` attribute, in a function’s declaration or definition, specifies never to clone that function. Thus, there will be only one compiled version of the function. See Label Value Caveats, for more information about cloning.

`always_inline`

  The `always_inline` attribute, in a function’s declaration or definition, specifies to inline all calls to that function (unless something about the function makes inlining impossible). This applies to all calls to that function in a compilation unit where it has this attribute. See Inline Function Definitions.

`gnu_inline`

  The `gnu_inline` attribute, in a function’s declaration or definition, specifies to handle the `inline` keyword the way GNU C originally implemented it, many years before ISO C said anything about inlining. See Inline Function Definitions.

For full documentation of attributes, see the GCC manual. See System Headers in Using the GNU Compiler Collection.