gpt4 book ai didi

c - 在 C 中的数组定义中使用宏

转载 作者:太空宇宙 更新时间:2023-11-04 02:27:44 24 4
gpt4 key购买 nike

我是 C 的新手,用它来编程 Nordic nrf52 芯片。我相信我的问题是一般的 C 问题,而不是应用程序。

我正在使用芯片 SDK 中预定义的宏设置一组结构。在数组初始化中使用这些宏是可行的,但逐个元素执行则不行。
因此,以下工作:

nrf_twi_mngr_transfer_t transfers_1[2] = { \
NRF_TWI_MNGR_WRITE(MSBARO5X_0_ADDR , &reg_addr[1], 1, NRF_TWI_MNGR_NO_STOP), \
NRF_TWI_MNGR_READ (MSBARO5X_0_ADDR , &p_buffer[0], sizeof(p_buffer), 0)
};

地点:

typedef struct {
uint8_t * p_data; ///< Pointer to the buffer holding the data.
uint8_t length; ///< Number of bytes to transfer.
uint8_t operation; ///< Device address combined with transfer direction.
uint8_t flags; ///< Transfer flags (see @ref NRF_TWI_MNGR_NO_STOP).
} nrf_twi_mngr_transfer_t;

NRF_TWI_WRITE 和 _READ 是使用更多宏的宏,例如:

#define NRF_TWI_MNGR_WRITE(address, p_data, length, flags) \
NRF_TWI_MNGR_TRANSFER(NRF_TWI_MNGR_WRITE_OP(address), p_data, length, flags)

使用

#define NRF_TWI_MNGR_WRITE_OP(address)      (((address) << 1) | 0)

#define NRF_TWI_MNGR_TRANSFER(_operation, _p_data, _length, _flags) \
{ \
.p_data = (uint8_t *)(_p_data), \
.length = _length, \
.operation = _operation, \
.flags = _flags \
}

我想做的是改变这个数组中的个别项目,例如:

transfers_1[0] = NRF_TWI_MNGR_WRITE(MSBARO5X_0_ADDR , &reg_addr[1], 1, NRF_TWI_MNGR_NO_STOP);

但是当我这样做时,我收到错误“expected an expression”。

MSBARO5X_0_ADDR 也在 define 语句中定义: #define MSBARO5X_0_ADDR 0x76

如果我用一个变量替换上面任何代码中的这个,我会得到同样的“期望一个表达式”错误。我怀疑我遇到的两个问题是由于我同样缺乏理解。所以请原谅我将两者结合在一个帖子中。

所以问题是:- 为什么我会收到此错误?-是否可以更改数组中的单个项目,如果可以,如何更改?- 是否可以使用变量代替 MSBARO5X_ADDR,如果可以,如何使用?

非常感谢!

最佳答案

最终,宏扩展为一个大括号括起来的初始值设定项。这样的东西不是表达式,所以它不能用作普通赋值的右侧(赋值和初始化是不同的东西)。它将作为更大的初始值设定项的一部分工作,但不是您尝试在未修改的情况下使用它的方式。

但一切并没有丢失。初始化程序的语法暗示 支持。所以我们可以使用一个技巧。结构对象可以分配给彼此。所以我们只需要从某个地方获取一个对象。我们可以使用 compound literal为了创建所述对象:

transfers_1[0] = (nrf_twi_mngr_transfer_t)NRF_TWI_MNGR_WRITE(/*Your arguments*/);

关于c - 在 C 中的数组定义中使用宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48668077/

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