首先请注意,长缓冲区的大小可能与您的预期不符,因为它是四舍五入的。例如,如果 core_context 的大小为 10 字节,并且一个请求的额外大小为 3 字节,并且假设长大小为 8 字节。你得到 (10+3)/8 = 1,所以你分配 1 个 long 来处理 13 个字节(而不是分配 2 个 long)。
所以而不是
unsigned long __##name##_ctx[(sizeof(coro_context)+size)/sizeof(unsigned long)]={0};
我想应该是
unsigned long __##name##_ctx[(sizeof(coro_context)+size+sizeof(unsigned long))/sizeof(unsigned long)]={0};
现在关于静态初始化,我不会使用长缓冲区,而是使用相同的前 n 个变量创建一个新结构,并在末尾使用请求大小的缓冲区。这个结构可以静态初始化,请求的指针会指向它。所以代码看起来像这样:
#define CORO_CONTEXT(name,size,my_private_method) \
typedef struct coro_context##_name {\
int id;\
jmp_buf env;\
list_head list;\
jmp_buf waiter;\
long timeout;\
void *private;\
char stack[0];\
char additional_buffer[size];\
} coro_context##name;\
coro_context##name __name##_ctx = {0,0,0,0,0,my_private_method};\
coro_context *name##_ctx = (coro_context *)&__name##_ctx
为简单起见,您还可以使用简化结构检查此代码,并使用 coro_context 结构作为包装结构的“基础”(即单个变量而不是声明所有 coro_context 变量):
typedef struct coro_context {
int id;
void *private;
} coro_context;
#define DECLARE_CORO_CONTEXT(size,private_method)\
typedef struct wrapper_for_core_context\
{\
coro_context base;\
char buffer[size];\
}wrapper;\
wrapper my_wrapper = { {0, private_method}, 0 };\
coro_context *cc = (coro_context *)&my_wrapper;
//now the using code
DECLARE_CORO_CONTEXT( 20, test_at_avro_bytes_field_all_data_values );