Обновить
2

Пользователь

1
Подписчики
Отправить сообщение

На самом деле можно объявить и не в начале, если создать новый scope, то есть выглядить это будет что-то вроде:


void foo() {
    uint32_t i;
    uint8_t c;
    /* do something */
    {
        uint32_t k = 1;
        /* do something else */
    }
   /* do yet another thing */
}

Еще можно добавить про способы упаковки структур. __attribute__ ((packed)) из gcc, не работет в Visual C++, а аналог делается через pragma. Поэтому в нашем проекте пришлось городить что типа вот этого:


#        if defined(_MSC_VER)
/*           __pragma() is specified starting from Visual Studio 2008*/
#            if (_MSC_VER < 1500)
#                error "Unsupport Visual C compiler version. Minimum version is Visual Studio 2008."
#            endif
#            define ATTRIBUTE_PACKED
/*           Enable packing and supress warning C4103: Packing was changed after the inclusion of the header, probably missing #pragma pop */
#            define BEGIN_ATTRIBUTE_PACKED __pragma(pack(push,1)) \
                                           __pragma(warning(disable : 4103))
/*           Disable packing and enable warning C4103 back */
#            define END_ATTRIBUTE_PACKED   __pragma(pack(pop)) \
                                          __pragma(warning(default : 4103))
#            define ATTRIBUTE_SECTION_GCC(x)
#        elif defined (__GNUC__)
#            define BEGIN_ATTRIBUTE_PACKED
#            define END_ATTRIBUTE_PACKED
#            if defined(__clang__)
#                define ATTRIBUTE_PACKED __attribute__ ((packed))
#            else
#                define ATTRIBUTE_PACKED __attribute__ ((gcc_struct,packed))
#            endif
#        endif /* defined(_MSC_VER) */

При это стурктуры потом приходится определять вот таким образом:


    BEGIN_ATTRIBUTE_PACKED

    struct s1 ATTRIBUTE_PACKED {
          ...
    }

    struct s2 ATTRIBUTE_PACKED {
           ...
    }

    END_ATTRIBUTE_PACKED

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность