【问题标题】:error: initializer element is not a compile-time constant错误:初始化元素不是编译时常量
【发布时间】:2015-12-24 09:09:28
【问题描述】:

我一直在寻找答案,但找不到任何东西可以让这段代码运行。我在声明时在主函数中得到了编译器突出显示的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 很有趣,但我仍然不明白,也不知道如何运行此代码。

【问题讨论】:

  • 你为什么把static放在首位?
  • 我问这个是因为我正在做一个项目。我需要创建的函数的原型必须是这样的: int get_next_line(int const fd, char ** line);我需要从任何类型的文件导向器中获取缓冲区并将指针返回到每一行的开头(例如文本文件的开头)。我编写了一个代码,将每一行存储在一个链表中,所以这不是问题。更清楚地说,该函数可以插入一个循环中,它会在每个循环(直到 EOF)改变指向行首的指针。静态变量在我的代码中会是什么样子?

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


【解决方案1】:

引用C11,§6.7.9,初始化

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

在您的代码中,

static char const *str = av[1];

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你可以通过编写来模拟这种行为:

      static const char *str;
      static bool already;
      if ( !already )
      {
          str = av[1];
          ++already;
      }
      

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

      const char *str;
      

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

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

      【讨论】:

        猜你喜欢
        • 2011-09-02
        • 2012-03-22
        • 1970-01-01
        • 2014-02-18
        • 2012-04-10
        • 2012-08-31
        • 1970-01-01
        相关资源
        最近更新 更多