我有一个函数需要一些常量数据,但检索常量数据需要调用一个执行线性搜索的函数来检索数据。我不想对函数的每次调用都执行搜索,所以我尝试将有问题的变量设置为 static
。但是静态变量不能初始化为非常量值:
int my_function(int foo)
{
static const Thing *bar = thing_from_name("bar");
return do_thing(foo, bar);
}
GCC 正确地提示“初始化器元素不是常量”。
在思考了一会儿我的处境之后,我想出了一个既能吃蛋糕又能吃的方法:
int my_function(int foo)
{
static const Thing *bar = NULL;
if (!bar) bar = thing_from_name("bar");
return do_thing(foo, bar);
}
到目前为止,这似乎工作正常,但感觉……不对。这种方法有什么缺陷吗?有没有更好的方法来解决我的问题?
需要明确的是,thing_from_name
实际上是一个纯函数,因为它只从内存中的常量数据中读取。由于它搜索的是字符串,因此我并没有一种简单的方法可以将其优化为常量表达式(据我所知)。
编辑:这里是 thing_from_name
所做的粗略概述,以供进一步了解:
const Thing *thing_from_name(const char *name)
{
const Thing *t;
for (t = &thing_array[0]; t->name != NULL; t++) {
if (strcmp(t->name, name) == 0) {
return t;
}
}
return NULL;
}
最佳答案
很可能对于纯 C 你必须使用像 Boost.Preprocessor
这样的东西.如果 thing_from_name()
可以表示为完全静态的代码,可以在编译时预先计算,那么您可能会成功。如果不是,那么您应该使用您的解决方案,但请记住它不是线程安全的。
关于c - 将函数中的静态变量初始化为非常量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23206333/