我有一个需要一些常量数据的函数,但是检索常量数据需要调用一个执行线性搜索的函数来检索数据。我不想对函数的每次调用执行搜索,所以我尝试制作有问题的变量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;
}
答案 0 :(得分:0)
可能对于普通C,你必须使用像Boost.Preprocessor
这样的东西。如果thing_from_name()
可以表示为完全静态代码,可以在编译时预先计算,那么您可能会成功。如果不是,那么你应该使用你的解决方案,但要记住它不是线程安全的。