Быстрый ответ: измените 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.)