Объявление функции до и после main () - PullRequest
1 голос
/ 04 мая 2019
#include <stdio.h>

int add2nums( int, int);

void main(void)
{
  int y,a,b;

  printf("Enter 2 numbers\n");
  scanf("%d%d", &a, &b);

  y = add2nums(a,b);

  printf("a is %d\n", a);
  printf("b is %d\n", b);
  printf("y is %d\n", y);
}


int add2nums( int num1, int num2)
{
  int sum;
  sum = num1 + num2;
  return(sum);
}

Так, обычно, когда я создаю новые функции в C, определение функции создается перед функцией main().

В моей лекции приведен пример того, как создать прототип функции и как они создаются, объявив его перед функцией main(), а затем определив его после завершения функции main(). При запуске вышеуказанной программы появляется следующая ошибка:

Строка 5: предупреждение: тип возвращаемого значения 'main' не является 'int' [-Wmain] |

Что происходит? И почему объявление функции add2nums() происходит дважды один раз перед main() и без параметров?

int add2nums( int, int);

и затем снова после окончания main() с параметрами num1 и num2

int add2nums( int num1, int num2)

Ответы [ 3 ]

2 голосов
/ 04 мая 2019

Для функции main() есть две действительные подписи:

int main( void )
int main( int argc, char *argv[] )

Обратите внимание, что обе действительные подписи имеют тип возврата int.Любой другой возвращаемый тип, например void, недопустим и заставляет компилятор выдавать предупреждающее сообщение.

Когда код вызывает функцию, компилятору необходимо знать сигнатуру этой вызываемой функции.Есть два способа сообщить компилятору, что такое сигнатура вызываемой функции:

  1. иметь целую функцию, указанную ранее, где она вызывается
  2. , иметь прототип (он же прямая ссылка)сигнатуры функции перед тем, где функция вызывается.В прототипе компилятору нужны только возвращаемый тип и типы параметров.Тем не менее, хорошая практика программирования - указывать имена параметров в прототипе в качестве любезности для людей, читающих код.
1 голос
/ 04 мая 2019

Объявление функции - это информация для компилятора (не для компоновщика, как говорится в другом ответе) - какого типа параметры функции и какой тип возвращаемого значения.

Так что имена параметров не нужны.

1 голос
/ 04 мая 2019
  1. На языке C функция main имеет сигнатуру int main(), которая позволяет вам возвращать значение обратно в ОС, но вы сделали main() без void возвращаемого типа. Из-за этого вы получили предупреждение.
  2. int add2nums( int, int); - это просто объявление функции, которое позволяет компилятору сделать ссылку на функцию. Это потому, что компилятор читает файл только один раз.
  3. Имена параметров не обязательны, поскольку они не являются частью подписи.
...