【问题标题】:C error: expected ';', ',' or ')' before '...' tokenC 错误:在 '...' 标记之前应有 ';'、',' 或 ')'
【发布时间】:2019-04-12 13:09:42
【问题描述】:

我有问题。 C中的面向对象编程的概念得到了作业。我需要使用可变参数函数。但是我弄错了。如果你能帮助我,我将不胜感激。我是编码新手。

RastgeleKarakter.h:

#ifndef RASTGELEKARAKTER_H
#define RASTGELEKARAKTER_H
struct RASTGELEKARAKTER{
// code
};

RastgeleKarakter SKarakterOlustur(int...); // prototype
void Print(const RastgeleKarakter);
#endif

RastgeleKarakter.c:

#include "RastgeleKarakter.h"
#include "stdarg.h
RastgeleKarakter SKarakterOlustur(int... characters){
//code
}

错误:

 make
gcc -I ./include/ -o ./lib/test.o -c ./src/Test.c
In file included from ./src/Test.c:3:0:
./include/RastgeleKarakter.h:17:38: error: expected ';', ',' or ')' before '...' token
RastgeleKarakter SKarakterOlustur(int...);

我不知道有多少参数。我想用变量函数解决这个问题。

【问题讨论】:

  • 我认为您需要在省略号之前使用逗号。
  • RastgeleKarakter SKarakterOlustur(int argCount, ...); // prototype代替RastgeleKarakter SKarakterOlustur(int...); // prototype
  • 在 .h 和 .c 文件中将 "," 放在 "..." 之前。 RastgeleKarakter SKarakterOlustur(int a, ...)
  • 是的。他们工作了。谢谢。
  • 请注意,使用可变参数函数是不好的做法。如果您尝试在 C 中执行 OO,尤其如此。

标签: c gcc prototype variadic


【解决方案1】:

参数列表不应有类型或名称

RastgeleKarakter SKarakterOlustur(int count, ...)

{
  va_list args;
  va_start(args, count);
  int i = va_arg(args, int);
}

使用stdarg.h 头文件中定义的宏来访问参数列表。 further reading

如果按照您原来的减速,您的意思是参数列表的所有成员都是整数,并且由于无论如何您都将提供计数,请考虑将其更改为 int count, int * list

【讨论】:

    【解决方案2】:

    C 中的可变参数是无类型和无名称的。可变参数函数的正确原型是:

    returnType functionName(type1 ordinaryArg1, type2 ordinaryArg2, ...)
    

    ... 之前至少需要一个普通参数。您只能通过stdarg.h 中的函数访问可变参数。

    【讨论】:

      【解决方案3】:

      错误表明编译器在省略号之前需要以下内容之一: -分号 -逗号 -右括号

      所以,原型没有正确声明。 声明至少需要一个命名变量,最后一个参数必须是省略号。

      例如,如果您打算将整数传递给方法,则声明可能如下:

      int  sum (int count, ...);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-05
        • 2014-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多