在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