c++ - c中的静态初始化

标签 c++ c static

我有一个函数,它传递一个整数列表,直到一个值为“-1”并计算最小值。

如果函数被调用几次,它应该返回所有调用之间的最小值。

所以我写了类似的东西:

int min_call(int num, ...)
{
    va_list argptr;
    int number;

    va_start(argptr, num);

    //static int min = va_arg(argptr, int); //////// the questioned line

    static int all_min = -1;

    int min = va_arg(argptr, int);

    if (min != -1)
    {
        while ((number = va_arg(argptr, int)) != -1)
        {
            if (number < min)
            {
                min = number;
            }

        }
    }

    if (min < all_min || all_min == -1)
    {
        all_min = min;
    }

    return all_min;
}

我想了解有关标记行的一些信息...为什么我不能调用它 - 编译器说因为用于初始化静态 int 的表达式不是常量。

出于某种原因,我记得我可以初始化一个静态变量,并且知道初始化语句只会被调用一次(第一次),它是用 C++ 编写的。 如果该行可用,它将为我节省几个变量。

C和C++在这件事上有区别吗?

最佳答案

是的,C++ 允许在运行时延迟初始化静态。有效地 C++ 将静态初始化变成这样:

static int XX_first_time = 1;
if (XX_first_time)
{
    // run the initializer
    XX_first_time = 0;
}

虽然这很方便,但它不是线程安全的。该标准不要求它是线程安全的,尽管一些编译器已经这样做了(gcc 4.x 进行线程安全初始化,除非明确要求不要使用 -fno-threadsafe-statics)。

C 要求静态变量在编译时配置它们的值。是的,这更受限制,但更符合 C 在背后为您做很少的工作(C 可以被认为是可移植程序集)。

关于c++ - c中的静态初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1986969/

相关文章:

c++ - 为什么一个非常量静态成员会有多个定义?

C |静态数组: why does writing out-of-bounds not result in exception?

python - 如何使用 Boost.Python 在 Python 中调用内置函数

c++ - 使用 POCO 进行客户端摘要身份验证

c - sscanf 和 strtok 未返回 "complete"答案

c - getopt_long() -- 使用它的正确方法?

c++ - 尝试访问类的字符串成员时出现段错误

c++ - 指向使用 Rcpp 对象创建的 C++ 类的指针

c - 如何在删除第一个索引中的元素后通过向左移动元素来减小数组的大小?

java - 静态类/常量字段层次结构 - 可以做到吗?