我有一个结构
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}));
这似乎有效,但我认为"内部"表示传递的文字的数组在内存中创建两次(宏评估它两次)。
这种想法有解决方案吗?
答案 0 :(得分:0)
这似乎有效,但我认为是“内部”数组, 表示传递的文字在内存中创建两次(宏 评估两次)。
来自C99标准:
6.5.3.4/2
sizeof运算符产生其操作数的大小(以字节为单位) 可以是表达式或类型的带括号的名称。大小是 根据操作数的类型确定。结果是整数。如果 操作数的类型是可变长度数组类型,操作数 被评估;否则,不评估操作数和结果 是一个整数常量。
所以A
只在宏中评估一次:
#define CREATE_BYTES(A) &((BYTES_T ){.bytes_p = ((A)), .num_bytes = sizeof((A))})