【发布时间】:2018-10-13 17:26:34
【问题描述】:
我想构建两个库 lib1.a 和 lib2.a。
lib2.a 处于顶层,它只能与lib1.a 全局数据共享,不能与头文件共享。然后 lib1.a 可以通过 extern 关键字使用这些数据。
我发现的困难是:我想用 lib2.a 中定义的数据在 lib1.a 内的 file1.c 中初始化一个常量。
例子:
//lib1.a->file1.c:
const My_Var_Type My_Var = {
.field1 = data1,
.field2 = data2,
.field3 = data3,
.field4 = data4
};
现在data1 到data4 应该从lib2.a 获得,我将它们声明为常量但没有办法!编译器产生这个错误:
initializer element is not constant
有没有办法解决这个错误?
【问题讨论】:
-
请创建一个minimal reproducible example,包括您的makefile或其他有关您如何构建的完整信息。
-
一个简单的解决方案是使用C++编译并将
data1等声明为extern "C"。 C++ 中const的语义与 C 中的不同,因此这段代码是合法的。我会把它作为一个答案发布,除了语言警察会否决它,因为它建议 C++ 作为 C 问题的解决方案。他们可能是对的,但也许 C++ 是你所需要的。 -
@Clifford 有趣的建议。为了不打扰编译并且非常放松,我推荐 PHP 或 JavaScript。
-
不是用 data 初始化
const,而是用 constant 初始化const。有关详细信息,最好查看定义/声明的代码,data1等。 -
@P__J__ C++ 的建议是由于它与 C 的简单互操作性,因为库 lib1.a 和 lib2.a 具有 C 链接接口。在其他语言中使用这些库可能并不那么简单。
标签: c initialization