C 使用“定义”将结构成员分配给同一结构的另一个成员

C 使用“定义”将结构成员分配给同一结构的另一个成员,c,c-preprocessor,C,C Preprocessor,我想将member1分配给member2。由于这是一个重复的操作,我想把assignmet放在一个#define中: 然而,这似乎是错误的,编译器如何知道它是同一个结构的成员,而我看不到使用它的方法。 有什么想法吗? 我知道我还有其他选择,如宏或函数,但我的问题是这种方法可行吗?编写这样的宏从来都不是一个好主意。写一些比mystruct.member1=mystruct.member2更好、更可读的东西可能是不可能的 如果出于任何原因想要封装此文件,请使用函数: #define op (stru

我想将member1分配给member2。由于这是一个重复的操作,我想把assignmet放在一个#define中:

然而,这似乎是错误的,编译器如何知道它是同一个结构的成员,而我看不到使用它的方法。 有什么想法吗?
我知道我还有其他选择,如宏或函数,但我的问题是这种方法可行吗?

编写这样的宏从来都不是一个好主意。写一些比
mystruct.member1=mystruct.member2更好、更可读的东西可能是不可能的

如果出于任何原因想要封装此文件,请使用函数:

#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 op (structType_t).member1=(structType_t).member2
这可能会被内联并替换为等价的
mystruct.member1=mystruct.member2

最后是坏主意宏,它可以使类型安全:

void structTypeMemberCopy (structType_t* obj)
{
  obj->member1 = obj->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
,并执行辅助功能

大概是这样的:

#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)T1.n1=T1.n2
类型定义结构{
int-n1;
int n2;
}结构;
int _tmain(int argc,_TCHAR*argv[]
{
结构试验;
试验n1=1;
试验2.n2=2;
a(试验);

std::cout您需要这样定义宏:

#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
,并执行辅助功能

大概是这样的:

#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)T1.n1=T1.n2
类型定义结构{
int-n1;
int n2;
}结构;
int _tmain(int argc,_TCHAR*argv[]
{
结构试验;
试验n1=1;
试验2.n2=2;
a(试验);

std::cout这是标记为C的。该宏非常危险,因为它缺少括号。如果有多个具有相同成员名称的结构,则该宏不具有类型安全性。这是标记为C的。该宏非常危险,因为它缺少括号。如果有多个具有相同成员名称的结构,则该宏不具有类型安全性。我似乎不明白如何操作最后一个宏可以工作,为什么要将其标记为类型安全?您可以添加内联关键字以确保它是内联的。@Abyr在C11中添加了_Generic关键字,并且可以在编译时检查传递给宏get的变量
obj
的类型。如果它是正确的类型,在这种情况下,类型为
structType\u t
的某个变量将运行e代码
(obj).member1=(obj).member2
。如果是错误的类型,则会出现编译器错误。@MeherKhiari这大部分是过时的编程风格。现在,编译器比程序员更擅长确定应该内联的内容。例如,如果程序员过度使用
内联
,则可能会导致不必要的大程序大小。我不这么认为似乎理解上一个宏是如何工作的,以及为什么将其标记为类型安全的?您可以添加内联关键字以确保它是内联的。@Abyr\u Generic关键字是在C11中添加的,并且可以在编译时检查传递给宏get的变量
obj
的类型。如果它是正确的类型,则在本例中使用类型
structType\t,它将运行代码
(obj)。member1=(obj).member2
。如果是错误的类型,则会出现编译器错误。@MeherKhiari这大部分是过时的编程风格。现在,编译器比程序员更擅长确定应该内联的内容。例如,如果程序员过度使用
内联
,则可能会导致不必要的大程序大小。