Предупреждение/ошибка "объявление функции не является прототипом

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

2022-10-21T07:04:17+00:00
Вопросы с похожей тематикой, как у вопроса:

Предупреждение/ошибка "объявление функции не является прототипом