#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, ...);