【问题标题】:Initializing a static variable in a function to a non-constant value将函数中的静态变量初始化为非常量值
【发布时间】:2014-06-06 01:05:06
【问题描述】:

我有一个需要一些常量数据的函数,但检索常量数据需要调用一个执行线性搜索的函数来检索数据。我不想为函数的每个调用执行搜索,所以我尝试制作有问题的变量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;
}

【问题讨论】:

  • 这就是为什么constexpr 是在C++11 中发明的:)
  • 你是多线程的吗? thing_from_name 是直接还是间接分配内存?如果这些问题的答案是“否”,那么您提出的解决方案是完全有效的,而且实际上很常见。
  • 你能提供'thing_from_name()'函数的伪代码吗?也许这有助于解释你的困境。
  • @MahonriMoriancumer,我在帖子中添加了它的功能大纲。
  • @user3386109,我认为我在技术上是多线程的,因为我使用的是 GTK,但是 IIRC 所有用户态代码都在一个线程中执行,除非你明确告诉 GTK 创建一个新线程(我不这样做' t)。

标签: c static constants


【解决方案1】:

对于纯 C 语言,您可能必须使用 Boost.Preprocessor 之类的东西。如果thing_from_name() 可以表达为完全静态的代码,可以在编译时预先计算,那么你可能会成功。如果不是,那么您应该使用您的解决方案,但请记住它不是线程安全的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    相关资源
    最近更新 更多