我有以下 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
是否有正确的方法来完成我在这里尝试做的事情,还是根本不可能?
最佳答案
我的看法,在一个可编译的样本中。这是一个编译 stub ,不会正确运行,所以不要尝试按原样运行它!
//
// 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);
}
这实例化了一个复合文字并将其地址传递给函数。文字的生命周期不超过完整调用表达式的生命周期。
关于c - 在 C 中将匿名结构作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24863449/