c中的静态初始化

Ida*_*dan 2 c c++ static

我有一个函数,它传递一个int列表,直到一个值为"-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;
}
Run Code Online (Sandbox Code Playgroud)

我想知道关于标记线的一些信息...为什么我不能称之为 - 编译器说因为用于初始化静态int的表达式不是常量.

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

在这个问题上C和C++之间有区别吗?

R S*_*hko 8

是的,C++允许在运行时懒惰地初始化静态.有效的C++将静态初始化转换为:

static int XX_first_time = 1;
if (XX_first_time)
{
    // run the initializer
    XX_first_time = 0;
}
Run Code Online (Sandbox Code Playgroud)

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

C要求静态是在编译时配置它们的值.是的,这是更有限的,但更符合C在你背后为你做的小工作(C可以被认为是便携式组装).

  • 此外,样本扩展巧妙地不正确.标准要求,如果本地静态初始化程序抛出异常,则该变量将被视为未初始化 - 即,在下一次执行函数时,应再次运行初始化程序.所以正确的扩展应该是`if(XX_first_time){/*run initializer*/; XX_first_time = 0; }`. (2认同)