c - 在 C 中将匿名结构作为参数传递

标签 c function struct parameters

我有以下 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/

相关文章:

function - 这个功能可以实现吗?

javascript - JavaScript 中可以编写连续的嵌套函数吗?

c - C 中不使用下取整函数将 float 向下舍入为整数值

arrays - 如何引用 Swift 4 中的结构在类中正确构造函数?

c++ - 结构和类错误

c - 在小结构的末尾而不是在 2 个成员之间进行对齐填充是否对性能更好?

ios - 未使用结构

c - 如何分配ION的预定义堆类型的内存?

c - 为什么这个C字符串化宏在扩展时会损坏?

c - 如何释放 g_thread_init 分配的内存