错误:初始化元素不是编译时常量

时间:2015-12-24 09:09:28

标签: c static compiler-errors initialization compile-time-constant

我一直在寻找答案,但找不到任何可以使这段代码运行的东西。在声明:

时,主函数中的编译器突出显示av[1]
static char const *str = av[1];

以下是我尝试使用gcc运行的代码:

#include <stdio.h>
#include <stdlib.h>

char    *ft_strjoin(char const *s1, char const *s2);

void    fct(char **av)
{
    static char const *str = av[1];
    str = ft_strjoin(av[1], av[1]);
    printf("%s\n", str);
}

int main(int ac, char **av)
{
    fct(&av[1]);
    fct(&av[1]);
    fct(&av[1]);
    fct(&av[1]);
    fct(&av[1]);
    fct(&av[1]);
}

我发现this很有趣,但我仍然没有得到它,也不知道如何运行此代码。

3 个答案:

答案 0 :(得分:3)

引用C11,§6.7.9,初始化

  

具有静态或线程存储持续时间的对象的初始值设定项中的所有表达式   应该是常量表达式或字符串文字。

在您的代码中,

static char const *str = av[1];

av[1]不是编译时常量值(即,不是常量表达式)。因此错误。

您需要从static移除str以避免此问题。

答案 1 :(得分:1)

Date变量需要使用编译时常量(常量字面值)进行初始化。 static将在运行时计算,这就是您收到错误消息的原因。

答案 2 :(得分:0)

您可以通过编写:

来模拟该行为
static const char *str;
static bool already;
if ( !already )
{
    str = av[1];
    ++already;
}

然而,与以下解决方案相比,这将是多余的:

const char *str;

因为您无论如何都会立即使用函数的返回值覆盖该值。

(你也在每个调用中传递相同的参数,所以即使你使用str,它仍然不需要是静态的。)