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