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

标签 c static constants

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

相关文章:

java - 抽象父类(super class)中静态变量的替代方案

用指定字符切割C中的字符串

更改返回地址以指向 shellcode

objective-c - 如何散列目录的(可能是递归的)内容

java - Singleton 类中的非静态成员

常量中的 PHP 数组键

assembly 线困惑 $lea 0xffffffe8(%ebp)$

Java:变量不递增

c++ - 引用作为参数

c# - 将 public const 与字符串一起使用是否安全?