分析解决sorry, unimplemented: non-trivial designated initializers not supported

在C++中包含C语言代码,extern “C”包含后发现部分代码报错,显然时语法语义上的不支持。

sorry, unimplemented: non-trivial designated initializers not supported

这个报错不是说extern C就可以解决的,其根源是编译器的支持问题,C使用gcc编译,C++使用g++编译,编译器对这个语法的支持时不一样的,extern C内的只是告诉g++编译器内部是C语言语法,而不是调用gcc编译,g++自身不支持该内部语法就会产生问题。

知道了问题原因是编译器支持问题,如何解决。首先知道结构体初始化的知识如下

在C++中初始化结构体可以直接使用顺序初始化,或者指定初始化designated initializer。

顺序初始化即

typedef struct FOO{        int a;    int b;    int c;}FOO;   FOO foo = {1,2,3};

C++指定初始化使用,有两种方式初始化,点号赋值和冒号赋值。冒号赋值如下:

typedef struct FOO{   
    int a;
    int b;
    int c;
}FOO;
FOO data = {
    a : 1,
    b : 2,
    c : 3,
};

在C语言中,特别是linux内核代码中经常可见点号赋值使用的指定初始化

但要注意有些编译器时不支持指定初始化的,在使用g++编译时就会发现报错。

sorry, unimplemented: non-trivial designated initializers not supported

所以在初始化时需要使用顺序初始化,语法可以保留,但要注意所有前序成员显式赋值。

typedef struct FOO{
    int a;
    int b;
    int c;
}FOO;
FOO foo = {.a = 1, .b = 2};  // OK
FOO foo1 = {.a = 1};            // OK
FOO foo2 = {.b = 2, .a = 1}; // Error sorry, unimplemented: non-trivial designated initializers not supported
FOO foo3 = {.a = 1, .c = 2}; // Error sorry, unimplemented: non-trivial designated initializers not supported 

你可能感兴趣的:(分析解决sorry, unimplemented: non-trivial designated initializers not supported)