Швидка відповідь: змініть, 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.)