将匿名结构作为参数传递给C.

时间:2014-07-21 10:57:39

标签: 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

是否有正确的方法来做我想在这里做的事情,或者这是不可能的?

3 个答案:

答案 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;在宏中,因为,没有键入宏参数。宏所做的只是替换符号。