Что означает «неявное объявление функции»?

17
#include <stdio.h>

int main()
{
    int a = 4;
    int b = 3;
    addNumbers(a, b);
}

int addNumbers(int a, int b)
{
    return a + b;
}

Почему это не компилируется, я получаю сообщение о неявном объявлении функции addNumbers() ?

    
задан bob 29.01.2010 в 11:38
источник
  • См. этот аналогичный вопрос, который был задан несколько часов назад: stackoverflow.com/questions/2160250/... –  jamesdlin 29.01.2010 в 11:41
  • В дополнение к объявлению функции addNumbers перед main, вот мои 2 цента о стиле C (не применимо для C ++): 1) функция, у которой нет параметров, должна иметь подпись (void) - и, следовательно, int main (void); 2) main должен возвращать значение в C, поэтому возврат 0 является обязательным. –  Alexander Poluektov 29.01.2010 в 11:43
  • , так как я могу его распечатать, так как, когда я запускаю его, он просто ничего не показывает, я попытался перейти от основного возврата суммы к printf (addNumbers (a, b)); но безрезультатно –  bob 29.01.2010 в 11:45
  • Это другой вопрос. Также я уверен, что вы можете найти ответ, если используете поиск в stackoverflow.com –  sharptooth 29.01.2010 в 11:47
  • @ Александр Полуэктов: на самом деле C99 следует за лидером C ++ и (по-моему, по-моему) дает вам разрешение не возвращать значение из main (), и это эквивалентно возврату 0. Это печально, а не, я думаю , полезно для дисциплины, чтобы убедиться, что функции, возвращающие значения, всегда возвращают значение. –  Jonathan Leffler 30.01.2010 в 07:00
Показать остальные комментарии

11 ответов

19

Определить функцию до main() или предоставить ее прототип до main() .

Итак, сделайте так:

#include <stdio.h>

int addNumbers(int a, int b)
{ //definition
}

int main()
{ //Code in main
  addNumbers(a, b);
}

или это:

#include <stdio.h>

int addNumbers(int, int);
int main()
{ //Code in main
  addNumbers(a, b);
}

int addNumbers(int a, int b)
{ // definition
}
    
ответ дан Prasoon Saurav 29.01.2010 в 11:41
  • В качестве побочного примечания не являются объявлениями функций, обычно выполняемыми в файле .h? –  Powerlord 29.01.2010 в 15:55
  • @R. Bemrose: когда есть более одного исходного файла, да. Когда есть только один исходный файл, как здесь, функция должна быть объявлена ​​как статическая функция (поскольку она не должна быть доступна из любого другого файла, так как есть только один файл для компиляции). –  Jonathan Leffler 30.01.2010 в 07:01
8

Вам нужно объявить функцию до того, как вы ее вызове в main (). Либо переместите его перед основным, либо, по крайней мере, объявите его там. Кроме того, вы должны попробовать добавить return 0 в конце основной функции, поскольку он должен возвращать int .

#include <stdio.h>

int addNumbers(int a, int b)
{
    return a + b;
}

int main()
{
    int a = 4;
    int b = 3;
    addNumbers(a, b);
    return 0;
}
    
ответ дан rui 29.01.2010 в 11:39
  • @ruibm: Кроме того, вы должны попробовать добавить return 0 в конце основной функции, так как он должен возвращать int: NO, который необязательно –  Prasoon Saurav 29.01.2010 в 11:45
  • Да, я знаю, что это так, но это хорошая практика программирования, и компилятор будет подвергать сомнению предупреждения, если вы включите педантичный режим. –  rui 29.01.2010 в 11:49
  • Дальше nitpicking, в C это «функция», а не «метод». В противном случае хорошо. –  Vatine 29.01.2010 в 11:56
  • Lol, хорошая точка @vatine, обновленный ответ. –  rui 29.01.2010 в 12:28
6

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

int addNumbers(int a, int b);

int main()
{
//    code of main() here
}

int addNumbers(int a, int b)
{
//code of addNumbers() here
}
    
ответ дан sharptooth 29.01.2010 в 11:40
4

Поместите addNumbers перед основным

int addNumbers(int a, int b)
{
    return a + b;
}

int main()
{
    int a = 4;
    int b = 3;

    addNumbers(a, b);
}

UPDATE

Чтобы напечатать его, printf("%i",addNumbers(a, b)); отобразит 7 в приведенном выше случае.

    
ответ дан YOU 29.01.2010 в 11:41
2

Вы можете переместить всю функцию выше точки ее вызова или использовать прототип функции, например:

#include <stdio.h>

int addNumbers(int a, int b); // function prototype

int main()
{
    int a = 4;
    int b = 3;
    addNumbers(a, b);
}

int addNumbers(int a, int b)
{
    return a + b;
}
    
ответ дан sergiom 29.01.2010 в 11:45
  • Поведение не определено. В соответствии со стандартами: вы должны объявить функцию перед использованием. –  Chankey Pathak 20.07.2010 в 09:06
2

Вам потребуется переадресация функции addNumbers или ее определение, перенесенное до первого использования:

// 2161304
#include <stdio.h>

// forward declaration
int addNumbers(int a, int b);

int main()
{
    int a = 4;
    int b = 3;
    addNumbers(a, b);
}

// alternatively move this up before main ...
int addNumbers(int a, int b)
{
    return a + b;
}

Относительно main и return :

Программы будут без компиляции. Подписи основного значения, определенные стандартом, следующие:

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

Существует три переносных значения возврата:

0, EXIT_SUCCESS, EXIT_FAILURE

, которые определены в stdlib.h .

    
ответ дан miku 29.01.2010 в 11:45
1

Объявите функцию перед ее использованием путем добавления прототипа перед main ():

int addNumbers(int a, int b);

или переместите всю функцию addNumbers до main ().

    
ответ дан Mark Tolonen 29.01.2010 в 11:45
1

Я согласен с объявлением и определением, но я не получаю ошибок компиляции с указанным выше кодом. Моя версия gcc - «4.4.1-4ubuntu9». Все идеи.

Я сделал небольшую модификацию для проверки кода.

 #include <stdio.h>

int main()
{
    int a = 4;
    int b = 3;
    printf("%d", addNumbers(a, b));   // Printf added.
}

int addNumbers(int a, int b)
{
    return a + b;
}
    
ответ дан Srinivas Reddy Thatiparthy 29.01.2010 в 15:49
0

, если ваш компилятор является стандартом C99, он выдает и «неявное объявление» ошибки, поскольку, поскольку продвижение по умолчанию устарело в стандарте C99. если вы попытаетесь скомпилировать стандарт C89, это будет допустимо.

В C99 необходим стандартный прототип функции

    
ответ дан C Learner 29.01.2010 в 13:05
0

Поскольку компилятор выполняет одну строку за другой, к моменту, когда он видит вызов функции, он должен иметь информацию об этой функции, которую вызывает главная функция. Мой друг должен сообщить компилятору о функции до вы можете когда-либо использовать его.

    
ответ дан Vijay 29.01.2010 в 13:31
0

Вы должны объявить функцию перед использованием. Помните эти четыре основные части при работе с функциями.

  1. Декларация
  2. Вызов
  3. Определение
  4. Возврат
ответ дан Chankey Pathak 20.07.2010 в 06:51