使用 define 将结构成员分配给同一结构的另一个成员
use define to assign a struct member to another member of the same struct
typedef struct{
[..]
type_t member1;
type_t member2;
[...]
}structType_t
我想将member1 分配给member2。由于这是一个重复的操作,我想把 assignmet 放在 #define:
#define op (structType_t).member1=(structType_t).member2
但是,这似乎是错误的,编译器如何知道它是同一结构的成员,我看不到使用它的方法。
有任何想法吗?
我知道我还有其他选项,例如宏或函数,但我的问题是这样可行吗?
编写这样的宏绝不是一个好主意。可能不可能写出比 mystruct.member1 = mystruct.member2;
.
更好、更易读的东西了
如果你出于任何原因想要封装它,请使用函数:
void structTypeMemberCopy (structType_t* obj)
{
obj->member1 = obj->member2;
}
这可能会被内联并替换为机器代码中 mystruct.member1 = mystruct.member2;
的等价物。
最后是 坏主意 宏,它可以是类型安全的:
#define structTypeCopy(obj) _Generic((obj), structType_t: (obj).member1 = (obj).member2)
...
structType_t mystruct = { ... };
structTypeCopy(mystruct);
您需要像这样定义宏:
#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;
}
typedef struct{
[..]
type_t member1;
type_t member2;
[...]
}structType_t
我想将member1 分配给member2。由于这是一个重复的操作,我想把 assignmet 放在 #define:
#define op (structType_t).member1=(structType_t).member2
但是,这似乎是错误的,编译器如何知道它是同一结构的成员,我看不到使用它的方法。 有任何想法吗? 我知道我还有其他选项,例如宏或函数,但我的问题是这样可行吗?
编写这样的宏绝不是一个好主意。可能不可能写出比 mystruct.member1 = mystruct.member2;
.
如果你出于任何原因想要封装它,请使用函数:
void structTypeMemberCopy (structType_t* obj)
{
obj->member1 = obj->member2;
}
这可能会被内联并替换为机器代码中 mystruct.member1 = mystruct.member2;
的等价物。
最后是 坏主意 宏,它可以是类型安全的:
#define structTypeCopy(obj) _Generic((obj), structType_t: (obj).member1 = (obj).member2)
...
structType_t mystruct = { ... };
structTypeCopy(mystruct);
您需要像这样定义宏:
#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;
}