【问题标题】:String assignment has incomplete type字符串赋值的类型不完整
【发布时间】:2016-02-18 03:50:01
【问题描述】:

我有一个共享库,它接受一个新的提示(对于 shell)作为参数 argv[1] 我也有一个全局变量提示类型字符串

char *prompt[];

int setprompt(int argc, char *argv[]) {
    prompt = argv[1];
    return 0;
}

我收到以下错误

setprompt.c:14:2: 错误:'prompt' 的类型不完整

提示 = argv[1];

^

【问题讨论】:

  • 如果prompt应该指向提示字符串,那么它的类型应该是char *,而不是(char *)[]。无论如何,后者确实是一个不完整的类型,因为它没有指定数组中元素的数量(char *)。

标签: c string variable-assignment incomplete-type


【解决方案1】:

应该声明为指针:

char *prompt;

传递给函数char *argv[] 的这个参数是一个指针数组,您正在为全局指针分配该数组中的一个元素。

【讨论】:

    【解决方案2】:

    在您的代码中,

    char *prompt[];
    

    您没有提供数组的大小。

    引用C11,第 §6.7.6.2 章

    如果大小不存在,则数组类型是不完整类型。 [...]

    只有在提供初始化列表时才允许这样做,否则,您必须明确指定大小。

    根据您的要求,将prompt 设置为char * 就足够了。

    【讨论】:

    • IIRC 它也被允许作为结构的最后一个数据成员。
    • @juanchopanza 绝对是先生,但那必须是struct 的成员。尽管如此,这将是一个不完整的类型,不是吗?如果我错了,请纠正我。
    • @SouravGhosh,你是绝对正确的。事实上,该标准正是这样表述的:“作为一种特殊情况,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型;这称为灵活数组成员。” (C2011, 6.7.2.1/18)
    【解决方案3】:

    您不能使用该语法声明全局或局部,因为它表示一个未指定大小的数组。这样的声明作为函数参数很好,因为数组衰减为指针。

    在您的情况下,您需要一个指针,而不是指针数组:

    char *prompt;
    

    【讨论】:

      猜你喜欢
      • 2015-07-23
      • 2013-12-12
      • 2017-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      相关资源
      最近更新 更多