使用文字数组或化合物

时间:2016-11-02 11:02:27

标签: c arrays literals

我有一个结构

typedef struct
{
    int num_bytes;   // number of relevant bytes
    void * bytes_p;  // pointer to bytes
} BYTES_T;

作为参数传递给很多地方的很多函数。

通常我按如下方式使用它:

uint8_t my_array[] = {0x01, 0x03, 0xff} ; // example array
BYTES_T my_bytes;
my_bytes.bytes_p = my_array;
my_bytes.num_bytes= sizeof(my_array);

...

foo(&my_bytes); // call a function

为了使我的代码部分更具可读性,我希望避免在同一个上下文中同时创建数组和结构。

因此,作为第一次尝试,我使用复合文字来玩一个宏:

#define ARRAYINFO(A) &((BYTES_T ){.bytes_p = ((A)), .num_bytes = sizeof(((A)))})

并像

一样使用它
foo(ARRAYINFO(my_array));

这适用于 - 传递数组时。但是当我将指针传递给数组时,它当然会产生废话:

uint8_t * array_pointer = my_array; // this is allowed
foo(ARRAYINFO(array_pointer ));     // nonsense for num_bytes because sizeof()

因此,这是危险的,不是一种选择。

NextI考虑了一个构造来创建结构而不显式创建数组:

#define CREATE_BYTES(A) &((BYTES_T ){.bytes_p = ((A)), .num_bytes = sizeof((A))})

BYTES_T my_bytes = CREATE_BYTES(((uint8_t []){1,2,3,4,5}));

这似乎有效,但我认为"内部"表示传递的文字的数组在内存中创建两次(宏评估它两次)。

这种想法有解决方案吗?

1 个答案:

答案 0 :(得分:0)

  

这似乎有效,但我认为是“内部”数组,   表示传递的文字在内存中创建两次(宏   评估两次)。

来自C99标准:

  

6.5.3.4/2

     

sizeof运算符产生其操作数的大小(以字节为单位)   可以是表达式或类型的带括号的名称。大小是   根据操作数的类型确定。结果是整数。如果   操作数的类型是可变长度数组类型,操作数   被评估;否则,不评估操作数和结果   是一个整数常量。

所以A只在宏中评估一次:

#define CREATE_BYTES(A) &((BYTES_T ){.bytes_p = ((A)), .num_bytes = sizeof((A))})