您的位置:首页 > 其它

error: initializer element is not constant

2014-06-03 11:52 555 查看
<pre name="code" class="cpp">typedef void (*app_static_init)(void **static_params, int cnt);
typedef void (*app_dynamic_init)(void *usr, void *dynamic_params);
typedef void *(*app_create)(void *static_params, void *dynamic_params);
typedef pthread_t (*app_start)(void *handle, int priority);
typedef void (*app_delete)(void *handle);

typedef struct app_task_spawn_info_t
{
int task_type;
char task_name[64];
int task_priority;
void *static_params;
void *dynamic_params;
void *app_handle;
app_static_init static_init_app;
app_dynamic_init dynamic_init_app;
app_create create_app;
app_start start_app;
app_delete delete_app;
}app_task_spawn_info_t;



static app_task_spawn_info_t app_list[]=
{
{APP_TYPE_OUTBOUND_TRANS_ENC, "outbound_trans_pthread", 90, NULL,\
&glb_outBound_trans_dynamic_params_default, gCtrol.handle_outBound_trans,\
outBound_trans_static_init, NULL, outBound_trans_create,
outBound_trans_start, outBound_trans_delete},
};


xx.c:56:5: error: initializer element is not constant

xx.c:56:5: error: (near initialization for 'app_list[0].app_handle')

编译时显示的错误,直接翻译"初始化的元素不是常量"。

问题出在结构体数组元素gCtrol.handle_outBound_trans
结构体初始化过程可以写成如下:

app_list[0].app_handle = gCtrol.handle_outBound_trans;

注意app_list是一个静态全局变量,初始化的时候其中值app_list[0].app_handle应该是一个常量,而gCtrol.handle_outBound_trans本身是变量,其值是不确定的,所以编译器在编译的时候即不能将其放入.data段,又不能放入.bss段,所以导致编译错误。

那么怎样来修改这个错误呢,我想可以使用双指针来解决,如下所示:

typedef struct app_task_spawn_info_t
{
int task_type;
char task_name[64];
int task_priority;
void *static_params;
void *dynamic_params;
void **app_handle;
app_static_init static_init_app;
app_dynamic_init dynamic_init_app;
app_create create_app;
app_start start_app;
app_delete delete_app;
}app_task_spawn_info_t;


static app_task_spawn_info_t app_list[]=
{
{APP_TYPE_OUTBOUND_TRANS_ENC, "outbound_trans_pthread", 90, NULL,\
&glb_outBound_trans_dynamic_params_default, &gCtrol.handle_outBound_trans,\
outBound_trans_static_init, NULL, outBound_trans_create,
outBound_trans_start, outBound_trans_delete},
};


这样展开后:

app_list[0].app_handle = &gCtrol.handle_outBound_trans;

变量gCtrol.handle_outBound_trans的地址是唯一确定的,这样app_list[0].app_handle初始化的值就是个常量。

问题解决。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c 编译错误