Предупреждение: C4013 в C lang - PullRequest
0 голосов
/ 23 июля 2010
#include <stdio.h>
#include <string.h>


void prints(char *menu)
{
 int p = 0;

 p = navigation(p, menu);

}

int navigation(int p, char *menu)
{

 return p;
}

void main(void)
{
 char *menu[] = {"data", "coming", "here"};

 prints(*menu);

 printf("\n");

}

Как я могу исправить это предупреждение:

Предупреждение 1 предупреждение C4013: «навигация» не определена;при условии внешнего возврата int i: * \ testingzone \ index.c 9

Ответы [ 5 ]

2 голосов
/ 23 июля 2010

Наряду с другими предложениями, которые вы получили для объявления функции, в этом случае вы можете просто изменить определения функций:

#include <stdio.h>
#include <string.h>

int navigation(int p, char *menu)
{
 return p;
}

void prints(char *menu)
{
 int p = 0;

 p = navigation(p, menu);
}

int main(void)
{
 char *menu[] = {"data", "coming", "here"};

 prints(*menu);
 printf("\n");
 return 0;
}

Это не всегда возможно.В частности, вам нужно , чтобы использовать объявление, если / если у вас есть взаимно рекурсивные функции (A вызывает B, а B также вызывает A).

Я также исправил неопределенное поведение, определяянеправильный тип возврата от main.

1 голос
/ 23 июля 2010

Объявляйте функции перед вызовом их. В вашем случае вы пытаетесь позвонить navigation, прежде чем объявить его. Это допустимо в C89 / 90, но обычно приводит к предупреждению компилятора. C99 спецификация языка C требует декларации, что означает, что ваше предупреждение превратится в ошибку в C99. Итак, если вы просто делаете

int navigation(); /* declaration */

перед попыткой вызова navigation предупреждение исчезнет.

Более того, неплохо бы не просто объявлять функции перед их вызовом, но фактически объявлять их с прототипом . С99 этого не требует, но, тем не менее, это очень хорошая практика. То есть navigation лучше объявить как

int navigation(int, char *); /* prototype */

или

int navigation(int p, char *menu); /* prototype */

в зависимости от ваших вкусов.

Обратите внимание, что текст предупреждения вашего компилятора вводит в заблуждение. Кажется, предполагается, что определение функций требуется перед вызовом. В действительности, вполне достаточно неопределяющего объявления .

0 голосов
/ 23 июля 2010
#include <stdio.h>
#include <string.h>


int navigation(int p, char *menu);
void prints(char *menu);





void main(void)
{
    char *menu[] = {"data", "coming", "here"};

    prints(*menu);

    printf("\n");

}

int navigation(int p, char *menu)
{


    return p;
}

void prints(char *menu)
{
    int p = 0;

    p = navigation(p, menu);

}

Даже при том, что это выглядит как снова, показывают ошибку при p = навигации (p, меню)

0 голосов
/ 23 июля 2010

Добавьте прототип int navigation(int p, char *menu); где-то выше первого раза navigation. Вы получаете эту ошибку, когда функция используется до ее определения.

0 голосов
/ 23 июля 2010

Это означает, что это говорит; Вы пытаетесь использовать навигацию (), которая еще не существует. Вы должны переместить навигацию (), чтобы быть первым методом в файле. В качестве альтернативы, и желательно, вы должны создать все функции в начале файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...