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