error: initializer element is not constant

时间:2021-03-15 04:27:15
<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初始化的值就是个常量。

问题解决。