gpt4 book ai didi

c - 使用宏初始化通过引用传递的结构

转载 作者:行者123 更新时间:2023-12-02 18:11:00 25 4
gpt4 key购买 nike

过去,我使用宏来通过以下方案初始化结构:

node.h

typedef struct Node_TypeDef
{
uint16_t netId;
const uint8_t UID[6];
}Node_TypeDef

#define NODE_INIT \
{ \
0x0002, /*NetID*/ \
{0x03, 0x44, 0x03, 0x00, 0xA0, 0x08}, /*UID*/ \
}

main.c

#include "node.h"

int main(void) {

Node_TypeDef node = NODE_INIT;


/*More Code*/

}

现在我想将初始化代码放入一个函数中,该函数接收指向结构的指针,然后使用宏指令根据第二个参数填充它。像这样的事情:

node.h

typedef struct Node_TypeDef
{
uint16_t netId;
const uint8_t UID[6];
}Node_TypeDef

#define NODE_INIT_1 \
{ \
0x0001, /*NetID*/ \
{0x03, 0x44, 0x03, 0x00, 0xA0, 0x08} /*UID*/ \
}

#define NODE_INIT_2 \
{ \
0x0001, /*NetID*/ \
{0x03, 0x44, 0x03, 0x00, 0xA0, 0x08} /*UID*/ \
}

.
.
.
.

#define NODE_INIT_N \
{ \
0x0001, /*NetID*/ \
{0x03, 0x75, 0x03, 0x00, 0xD0, 0x0A} /*UID*/ \
}

void initNode (Node_TypeDef *node, uint8_t mode);

node.c

#include node.h

Node_TypeDef ptrNode;

void initNode (Node_TypeDef *node, uint8_t mode)
{
switch (mode) {
case 1:
*node = NODE_INIT_1;
break;
case 2:
*node = NODE_INIT_2;
break;
.
.
.
default:
break;
}
ptrNode = node;
}

main.c

#include "node.h"

int main(void) {

Node_TypeDef node;
initNode (&node,2);


/*More Code*/

}

尽管如此,作为一个宏,它不是一个变量。它在编译时被替换;引用运算符不能只是赋值。此外,作为一个结构体,我应该使用 memcpy() 来分配它,但我需要放置该常量的内存地址。

总结:

如何将值分配给通过引用宏中定义的常量值传递的结构?

非常感谢您对此提供的任何帮助。

最佳答案

为此,您需要compound literal :

#define NODE_INIT           \                                   
((struct Node_TypeDef){ \
0x0002, /*NetID*/ \
{0x03, 0x44, 0x03, 0x00, 0xA0, 0x08}, /*UID*/ })

之后,这应该可以工作:

*node = NODE_INIT; 

关于c - 使用宏初始化通过引用传递的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72353526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com