我有以下c行(为了便于阅读而添加了回车符 - 它们不在代码中):
#define i2c_write(slave_addr, reg_addr, len, *data_ptr)
twi_master_write(MPU_TWI, {
.addr = reg_addr,
.addr_length = 1,
.buffer = *data_ptr,
.length = len,
.chip = slave_addr
})
twi_master_write()
声明为:
uint32_t twi_master_write(Twi *p_twi, twi_packet_t *p_packet);
和twi_packet_t
声明为:
typedef struct twi_packet {
uint8_t addr[3];
uint32_t addr_length;
void *buffer;
uint32_t length;
uint8_t chip;
} twi_packet_t;
twi_write()
的参数都必须是unsigned char
类型。
编译时,我收到以下错误:
expected expression before '{' token
是否有正确的方法来做我想在这里做的事情,或者这是不可能的?
答案 0 :(得分:3)
我对它的看法,在一个可编辑的样本中。这是一个编译存根,无法正常运行,所以不要试图按原样运行它!
//
// Cobbling up a compilation stub
//
#include <stdint.h>
struct Twi;
typedef struct Twi Twi;
#define MPU_TWI (Twi*)0
typedef struct twi_packet {
uint8_t addr[3];
uint32_t addr_length;
void *buffer;
uint32_t length;
uint8_t chip;
} twi_packet_t;
uint32_t twi_master_write(Twi *p_twi, twi_packet_t *p_packet);
//
// Now for my answer :
//
#define i2c_write(slave_addr, reg_addr, len, data_ptr) \
twi_master_write(MPU_TWI, &(twi_packet_t){ \
.addr = reg_addr, \
.addr_length = 1, \
.buffer = *data_ptr, \
.length = len, \
.chip = slave_addr \
})
main()
{
// Trigger that macro !
i2c_write(0, 0, 0, (void**)0);
}
此实例化复合文字并将其地址传递给该函数。文字的生命周期不超过完整的调用表达式。
答案 1 :(得分:2)
这是一种更可读,更正确的编写宏的方法。
它适用于if/else
子句的所有情况,结构在范围内定义,因此它的名称是本地的,不会污染您的名称空间。
#define i2c_write(_slave_addr, _reg_addr, _len, _data_ptr) \
do { \
twi_packet_t temp = { \
.addr = _reg_addr, \
.addr_length = 1, \
.buffer = _data_ptr, \
.length = _len, \
.chip = _slave_addr }; \
\
twi_master_write(MPU_TWI, &temp); \
} while (0)
答案 2 :(得分:1)
如果您提供一组简单的完整代码会更好,这样我们就可以在这里执行并帮助您。同时,我不认为你可以使用&#39; *&#39;在宏中,因为,没有键入宏参数。宏所做的只是替换符号。