Цитата(scifi @ Aug 13 2015, 13:40)

Ничего странного. Просто упаковывают структуру разными способами в зависимости от применяемого компилятора.
ЧТО директивы делают я понимаю, я просто не могу понять смысла их комбинации:
Код
#if defined(__ICCARM__) || defined(__ICCAVR__)
#pragma pack(ALIGNMENT) // Если IAR - последующие объявления пакуются по ALIGNMENT (4)
#define __attribute__(...) // ??? возможно это отмена ключевого слова attribute - но зачем?
#endif
#if !defined(__ARMCC_VERSION)
#pragma pack (push, 4) // Если не ARMCC, снова приказываем паковать по 4 с сохранением текущего уровня упаковки
#endif
typedef struct GOST28147_BCTX_tag {
...
#if defined(__ICCARM__) || defined(__ICCAVR__)
}__attribute__ ((packed)) GOST28147_BCTX, *GOST28147_BCTX_PTR; // Если IAR - используем (отмененное?) ключевое слово
#else
} GOST28147_BCTX, *GOST28147_BCTX_PTR;
#if !defined(__ARMCC_VERSION)
#pragma pack (pop) // Если не ARMCC - возвращаем уровень упаковки
#endif
#if defined(__ICCARM__) || defined(__ICCAVR__)
#pragma pack() // Если IAR - ставим уровень упаковки по умолчанию
#endif
Т.е. если я правильно разобрал, в случае компилятора IAR явная упаковка указывается 2 раза, а для других компиляторов - ни одного. Наверное, стоит добавить условие упаковки для ARMCC?
Цитата(aaarrr @ Aug 13 2015, 13:58)

Нет, первое было:
Код
UCHAR RFC4357_KeyUnwrap(GOST28147_BCTX_PTR pX,
__packed RFC4357_WRAPPED_KEY_PTR pWrappedKey,
PUCHAR pUnwrappingKey,
PUCHAR pUnwrappedKey)
Мне кажется, что с точки зрения языка оба объявления тождественны. Но проверю

Хм, забавно.
__packed RFC4357_WRAPPED_KEY_PTR pWrappedKey - ничего не дает, а
__packed RFC4357_WRAPPED_KEY *pWrappedKey выдает ошибку "Error: C2510E: Definition of 'struct RFC4357_WRAPPED_KEY_tag' not '__packed': qualifier ignored". Получается, если параметр функции указан как __packed, то тип должен быть упакован явно.