Переносимый макрос SWAP C, который не требует аргумента type и не использует memcpy

Макросы подкачки, которые принимают тип, довольно хорошо известны.

#define SWAP(type, a_, b_) do {        \
    type SWAP, *a = &(a_), *b = &(b_); \
    SWAP = *a;                         \
    *a = *b;                           \
    *b = SWAP;                         \
} while (0)

также:Макрос SWAP (t, x, y), обменивающийся двумя аргументами типа t

Возможно ли реализовать эту функциональность, будучи ...

переносимый (не зависит от компилятораtypeof)без использования вызовов функций, таких какmemcpy
(который не может быть оптимизирован,это не было в моих тестах по крайней мере)

Я придумалнедостатки метод, который использует структуру, определенную как размер входных данных.

#define SWAP(a_, b_) do \
{ \
    struct { \
        char dummy_data[sizeof(a_)]; \
    } SWAP, *a = (void *)(&(a_)), *b = (void *)(&(b_)); \
    /* ensure sizes match */ \
    { char t[(sizeof(a_) == sizeof(*a)) ? 1 : -1]; (void)t; } \
    /* check types are compatible */ \
    (void)(0 ? (&(a_) == &(b_)) : 0); \
    SWAP = *a; \
    *a = *b; \
    *b = SWAP; \
} while (0)

... но он может потерпеть неудачу, если временныйstruct дополняется компилятором(В зависимости от GCC__packed__ будет работать, но тогда его больше не будет портативным)
Это также может иметь проблемы с выравниванием в зависимости от архитектуры.

Ответы на вопрос(1)

Ваш ответ на вопрос