Ошибка C: ожидаемый ‘;’, ‘,’ или ‘)’ перед ‘…’ токеном

#c #gcc #prototype #variadic

#c #gcc #прототип #переменный

Вопрос:

У меня проблема. Концепция объектно-ориентированного программирования на 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...);
  

Я не знаю, сколько там параметров. Я хочу решить эту проблему с помощью функции переменной.

Комментарии:

1. Я думаю, вам нужна запятая перед многоточием.

2. Вместо RastgeleKarakter SKarakterOlustur(int...); // prototype использования RastgeleKarakter SKarakterOlustur(int argCount, ...); // prototype

3. поместите «,» перед «…» в файлах .h и .c. RastgeleKarakter SKarakterOlustur(int a, ...)

4. ДА. Они сработали. Спасибо.

5. Пожалуйста, обратите внимание, что использование переменных функций является плохой практикой. Особенно, если вы пытаетесь выполнить OO на C.

Ответ №1:

Список параметров не должен иметь ни типа, ни имени

 RastgeleKarakter SKarakterOlustur(int count, ...)

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

Используйте макросы, определенные в stdarg.h заголовочном файле, для доступа к списку параметров. дальнейшее чтение

Если при вашем первоначальном замедлении вы имели в виду, что все элементы списка параметров являются целыми числами, и поскольку вы все равно будете указывать количество, подумайте об изменении его на int count, int * list

Ответ №2:

Переменные аргументы в C нетипизированы и не имеют имен. Правильный прототип для переменной функции:

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

Вам нужен хотя бы один обычный аргумент перед ... . Вы можете получить доступ только к переменным аргументам через функции из stdarg.h .

Ответ №3:

Ошибка говорит о том, что компилятор ожидает одно из следующих действий перед многоточием: -точка с запятой -запятая -закрывающие круглые скобки

Итак, прототип объявлен неправильно. Для объявления требуется хотя бы одна именованная переменная, а последним параметром должно быть многоточие.

Например, если вы собираетесь передавать целые числа в метод, объявление может быть следующим:

 int  sum (int count, ...);