используйте define, чтобы назначить член структуры другому члену той же структуры - PullRequest
1 голос
/ 15 марта 2019
typedef struct{
               [..]
               type_t member1;
               type_t member2;
               [...]       

}structType_t

Я хочу назначить member1 для member2. Поскольку это повторяющаяся операция, я подумал о том, чтобы поместить assignmet в #define:

#define op (structType_t).member1=(structType_t).member2

Однако, похоже, что это неправильно, как компилятор узнает, что это члены одной и той же структуры, и я не вижу способа его использования. Есть идеи? Я знаю, что у меня есть другие варианты, такие как макрос или функция, но у меня такой вопрос?

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Написание таких макросов никогда не было хорошей идеей.Вероятно, невозможно написать что-то лучше и более читабельное, чем mystruct.member1 = mystruct.member2;.

. Если вы хотите инкапсулировать это по какой-либо причине, используйте функцию:

void structTypeMemberCopy (structType_t* obj)
{
  obj->member1 = obj->member2;
}

Это может произойтидля вставки и замены в машинном коде эквивалентом mystruct.member1 = mystruct.member2;.

И, наконец, есть макрос bad idea , который можно сделать безопасным для типа:

#define structTypeCopy(obj) _Generic((obj), structType_t: (obj).member1 = (obj).member2)

...

structType_t mystruct = { ... };
structTypeCopy(mystruct);
0 голосов
/ 15 марта 2019

Вы должны определить макрос следующим образом:

#define a(T1) T1.n1 = T1.n2

макрос a получает один параметр T1 и выполняет присвоение.

Примерно так:

#include <iostream>

#define a(T1) T1.n1 = T1.n2

typedef struct {
    int n1;
    int n2;
} estructure;

int _tmain(int argc, _TCHAR* argv[])
{
    estructure test;

    test.n1 = 1;
    test.n2 = 2;

    a(test);

    std::cout << test.n1 << " " << test.n2 << std::endl;

    return 0;
}
...