我分配新值的部分解决方案(在 gcc 中使用 c99-syntax):
#define arr_set(type, arr, ...) { \
int arr_size = sizeof((type[]){__VA_ARGS__}) / sizeof(type); \
type *parr = (type[]){__VA_ARGS__}; \
for (int i = 0; i < arr_size; i++) \
arr[i] = *parr++; }
这不安全(没有边界检查),只覆盖从头开始的连续成员,但我发现它有时很有用。
完整示例:
#include <stdio.h>
#define arr_set(type, arr, ...) { \
int arr_size = sizeof((type[]){__VA_ARGS__}) / sizeof(type); \
type *parr = (type[]){__VA_ARGS__}; \
for (int i = 0; i < arr_size; i++) \
arr[i] = *parr++; }
#define print_buf_int(buf) { \
for (int i = 0; i < sizeof(buf)/sizeof(buf[0]); i++) \
printf("%d ", (int)buf[i]); \
printf("\n"); }
#define print_buf_char(buf) { \
for (int i = 0; i < sizeof(buf)/sizeof(buf[0]); i++) \
if (buf[i]) \
printf("%c ", (char)buf[i]); \
else \
printf("null "); \
printf("\n"); }
#define print_buf_str(buf) { \
for (int i = 0; i < sizeof(buf)/sizeof(buf[0]); i++) \
printf("%s ", (char*)buf[i]); \
printf("\n"); }
int main()
{
int brr[8] = {};
int arr[8] = {3, 4, 5, 1, 0, 2};
print_buf_int(arr);
arr_set(int, arr, 9, 8 ,7);
print_buf_int(arr);
arr_set(int, arr, 0, 1, 2, 3, 4, 5, 6, 7);
print_buf_int(arr);
arr_set(int, arr, 11, 22, 33, 44, 55, 66, 77, 88, 99); // 'brr' gets overwritten!!!
print_buf_int(arr);
print_buf_int(brr);
unsigned char crr[13] = {'a', 'b', 'c', [12] = 'z'};
print_buf_char(crr);
arr_set(char, crr, 'd', 'e', 'f', '1', '2', '3');
print_buf_char(crr);
unsigned short srr[] = {111, 222, 333, 444, 555};
print_buf_int(srr);
arr_set(unsigned short, srr, -1, 0, 666);
print_buf_int(srr);
char *prr[] = {"hello", "variadic", "world"};
print_buf_str(prr);
arr_set(char*, prr, "good", "bye");
print_buf_str(prr);
}
输出:
3 4 5 1 0 2 0 0
9 8 7 1 0 2 0 0
0 1 2 3 4 5 6 7
11 22 33 44 55 66 77 88
99 0 0 0 0 0 0 0
a b c null null null null null null null null null z
d e f 1 2 3 null null null null null null z
111 222 333 444 555
65535 0 666 444 555
hello variadic world
good bye world