Быстрый ответ: измените int testlib() на int testlib(void), чтобы указать, что функция не принимает аргументов.
прототип - это по определению объявление функции, которое определяет тип (ы) аргумента (ов) функции.
Объявление функции, не являющейся прототипом, например
int foo();
- это объявление в старом стиле, в котором не указывается количество или типы аргументов. (До стандарта ANSI C 1989 года это был единственный вид объявления функции, доступный в языке.) Вы можете вызвать такую функцию с любым произвольным числом аргументов, и компилятор не обязан жаловаться - но если вызов несовместим с определением, ваша программа имеет неопределенное поведение.
Для функции, которая принимает один или несколько аргументов, вы можете указать тип каждого аргумента в объявлении:
int bar(int x, double y);
Особый случай - функции без аргументов. Логически пустые круглые скобки были бы хорошим способом указать, что функция не принимает аргументов, но этот синтаксис уже использовался для объявлений функций в старом стиле, поэтому комитет ANSI C изобрел новый синтаксис, используя ключевое слово void:
int foo(void); /* foo takes no arguments */
определение функции (которое включает код того, что функция фактически делает) также предоставляет объявление. В вашем случае у вас есть что-то похожее на:
int testlib()
{
/* code that implements testlib */
}
Это не является прототипом объявления для testlib. В качестве определения это сообщает компилятору, что testlib не имеет параметров, но в качестве объявления оно сообщает компилятору только о том, что testlib принимает некоторое неуказанное, но фиксированное количество и тип (ы) аргументов.
Если вы измените () на (void), объявление станет прототипом.
Преимущество прототипа в том, что если вы случайно вызовете testlib с одним или несколькими аргументами, компилятор диагностирует ошибку.
(В C ++ есть несколько другие правила. В C ++ нет объявлений функций в старом стиле, а пустые скобки означают, что функция не принимает аргументов. C ++ поддерживает синтаксис (void) для согласованности с C.Но если вам специально не нужен ваш код для компиляции обоих как C и C ++ вам, вероятно, следует использовать () в C ++ и (void) синтаксис в C.)
person
Keith Thompson
schedule
30.12.2013