C 将函数中的静态变量初始化为非常量值

C 将函数中的静态变量初始化为非常量值,c,static,constants,C,Static,Constants,我有一个需要一些常量数据的函数,但是检索常量数据需要调用一个执行线性搜索的函数来检索数据。我不想对函数的每个调用都执行搜索,所以我尝试使有问题的变量成为静态的。但是静态变量不能初始化为非常量值: int my_函数(int foo) { 静态常量Thing*bar=Thing_from_name(“bar”); 返回do_thing(foo,bar); } GCC正确地抱怨“初始值设定项元素不是常量” 在考虑了一下我的处境后,我想出了一个吃蛋糕的办法: int my_函数(int foo) {

我有一个需要一些常量数据的函数,但是检索常量数据需要调用一个执行线性搜索的函数来检索数据。我不想对函数的每个调用都执行搜索,所以我尝试使有问题的变量
成为静态的
。但是静态变量不能初始化为非常量值:

int my_函数(int foo)
{
静态常量Thing*bar=Thing_from_name(“bar”);
返回do_thing(foo,bar);
}
GCC正确地抱怨“初始值设定项元素不是常量”

在考虑了一下我的处境后,我想出了一个吃蛋糕的办法:

int my_函数(int foo)
{
静态常量*bar=NULL;
如果(!bar)bar=thing_from_name(“bar”);
返回do_thing(foo,bar);
}
到目前为止,这似乎效果不错,但感觉。。。错。这种方法有什么缺陷吗?有更好的办法解决我的问题吗

需要明确的是,
thing\u from\u name
实际上是一个纯函数,因为它只读取内存中的常量数据。因为它搜索字符串,所以对于我来说,没有一种简单的方法将其优化为常量表达式(据我所知)

编辑:这里有一个关于
名称中的东西的大致轮廓,供进一步说明:

const Thing*Thing\u from\u name(const char*name)
{
常数事物*t;
for(t=&thing_数组[0];t->name!=NULL;t++){
if(strcmp(t->name,name)==0){
返回t;
}
}
返回NULL;
}

对于纯C,您可能必须使用类似的东西。如果来自\u name()
thing\u可以表示为完全静态的代码,可以在编译时预先计算,那么您可能会成功。如果没有,那么您应该使用您的解决方案,但请记住它不是线程安全的。

这就是为什么
constepr
是在
C++11
中发明的:)您是多线程的吗?名称中的
thing\u是否直接或间接分配内存?如果这些问题的答案是“否”,那么您提出的解决方案是完全有效的,并且事实上非常常见。您能否为“thing_from_name()”函数提供伪代码?也许这会有助于解释您的困境。@MahonriMoriancumer,我已经在文章中添加了一个关于它的作用的概要。@user3386109,我认为我在技术上是多线程的,因为我使用的是GTK,但IIRC所有用户代码都在一个线程中执行,除非您明确告诉GTK创建一个新线程(我没有)。