Макрос C для встраивания функций с компилятором IAR

С предыдущим компилятором gcc мы сделали это:

      #define DO_PRAGMA(x)        _Pragma(#x)
#define PACK_ON(n)          DO_PRAGMA(pack(n))

так что фактически означало бы, что PACK_ON (2) будет расширяться до _Pragma(pack (2)). Затем мы будем использовать его так

      PACK_ON(2)
typedef struct{
...
};

Однако компилятору IAR нужно что-то вроде этого: _Pragma("pack (2)") Итак, я попытался реализовать макрос для pack следующими способами, не компилирующими:

      #define DO_PRAGMA(x)        _Pragma(#x)
#define PACK_ON(n)          DO_PRAGMA(" ## "pack(#n)"" ## ")
#define PACK_ON(n)          DO_PRAGMA(" ## pack(#n) ## ")
#define PACK_ON(n)          DO_PRAGMA(" ## #pack(n) ## ")
#define PACK_ON(n)          DO_PRAGMA(" ## #pack(n) ## ")
#define PACK_ON(n)          DO_PRAGMA("pack(n)")
#define PACK_ON(n)          DO_PRAGMA("pack(#n)")
#define PACK_ON(n)          DO_PRAGMA(pack(#n))
#define PACK_ON(n)          DO_PRAGMA(pack(n))
#define PACK_ON(n)          DO_PRAGMA(#pack(#n))
#define PACK_ON(n)              \#if (n == 1)\ _Pragma("pack(1)")
#define PACK_ON(n)          _Pragma("pack( ## #n ## )")
#define PACK_ON(n)          _Pragma("pack( ## n ## )")
#define PACK_ON(n)          _Pragma("pack(n)")
#define PACK_ON(n)          _Pragma("pack(#n)")

Есть ли у кого-нибудь макрос, который работал бы с компилятором IAR для упаковки различных размеров n? В противном случае я просто заставлю все упаковать размер 1 и вручную изменить структуры, которые используют 2 и 4.

Временное решение: мне удалось обойти это, выполнив следующие действия:

      #define PACK_ON(n)              _Pragma("pack(1)")

и вручную изменив небольшую горстку, которая была PACK_ON (2) и PACK_ON (4)

2 ответа

Учитывая, что компилятор поддерживает pack(1), push и pop pragmas, то это стандартное решение C работает:

      #include <stdio.h>

#define DO_PRAGMA(x)        _Pragma(#x)
#define PACK_ON(n)          _Pragma("pack(push)") DO_PRAGMA(pack(n))
#define PACK_OFF            _Pragma("pack(pop)")

PACK_ON(1)
typedef struct 
{
  char c;
  short s;
} foo;
PACK_OFF

typedef struct 
{
  char c;
  short s;
} bar;


int main()
{ 
  printf("%zu\n", sizeof(foo));
  printf("%zu\n", sizeof(bar));
}

Выход

      3
4

Протестировано на gcc, clang и icc со строгими стандартными настройками ( -std=c11 -pedantic-errors).

с указанным выше PACK_ON я получаю идентификатор ошибки «pack» не определен. Мне удалось обойти это, выполнив следующее: #define PACK_ON(n) _Pragma("pack(1)") и вручную изменив небольшую горстку, которая была PACK_ON (2) и PACK_ON (4)

Другие вопросы по тегам