# V2639. MISRA. Default association should appear as either the first or the last association of a generic selection.

Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.

Это правило актуально только для языка С.

Ассоциация по умолчанию (объявленная с ключевым словом `default`) в конструкции `_Generic` (С11) должна располагаться первой или последней в списке ассоциаций. Такая структура упрощает понимание кода другими программистами.

Рассмотрим пример:

    #define abs(Y)( _Generic( (Y)        \
                  , long     : labs     \
                  , default  : abs      \
                  , long long: llabs)(Y))

    long foo(long x)
    {
      return abs(x);
    }

Ассоциация `default` располагается между двумя другими: `int` и `char`. Такой порядок списка ассоциаций усложняет конструкцию `_Generic`.

Исправленный код:

    // First option
    #define abs(Y)(_Generic( (Y)        \
                  , default  : abs      \
                  , long     : labs     \
                  , long long: llabs)(Y))

    // Second option
    #define abs(Y)( _Generic( (Y)      \
                  , long     : labs   \
                  , long long: llabs  \
                  , default  : abs)(Y))

    long foo(long x)
    {
      return abs(x);
    }

Данная диагностика классифицируется как:

MISRA-C-2023-23.8