简体   繁体   中英

warning: implicit declaration of function is invalid in C99?

This is a header file

#include <stdio.h>

int m = 18;
int x = 4;

int singles (n) {
    if (n == 1)
         return 0;
    return doubles(n-1);
} 

int doubles (n) {
    if (n == 1)
        return 0;

    return triples(n-1);
}

int triples (n) {
    if (n == 1)
        return m;

    return (singles(n-1) + doubles (n-1) + triples (n-1))*(m-1);
}

and this is the main file

#include <stdio.h>
#include "test.h"

int main () {
    printf("%d",singles (x));
}

So this is pretty complicated for me at-least.The idea is that in the main function i will call singles(x) where x =4 so its more like singles (4),it will call doubles (3),that will call triples (2),that will call all of singles(1) which will return 0,doubles (1) that returns 0 and triples (1) that will return m.

So the error i am getting is

./test.h:13:12: warning: implicit declaration of function 'doubles' is invalid
      in C99 [-Wimplicit-function-declaration]
    return doubles(n-1);
       ^
./test.h:20:12: warning: implicit declaration of function 'triples' is invalid
      in C99 [-Wimplicit-function-declaration]
    return triples(n-1);
       ^
2 warnings generated. 

I tried to create a header file .h with the first script and then made a second .c script that i try to compile that won't work.I tried importing the header to try to avoid this error but it doesn't seem to work. Thanks a lot

Inside of singles , you're using doubles before it's defined. Similarly in doubles , you're using triples before it's defined. That's why you're getting the implicit declaration errors.

Also, you're not defining the type of the n parameter to any of these functions.

You need to specify function prototypes, which declare the function without defining it:

int singles(int n);
int doubles(int n);
int triples(int n);

Also, you shouldn't define functions in a header file. If you include this header in multiple .c files and then link them together, you'll get an error because you'll have multiple definitions of those functions.

Take all of the function definitions and put them in test.c. Then in test.h, put only the prototypes above. Then you can compile everything as follows:

gcc -c test.c
gcc -c main.c
gcc -o main main.o test.o

Or in a single line:

gcc -o main test.c main.c

The term "implicit declaration" in an error message is usually generated when the compiler sees the implementation of a call to a function before the declaration (prototype).

For example, you should have:
header file

int singles(int x);
int doubles(int x);
int triples(int x);

In your source file:

#include "header_file.h"

Also, in your function definitions (implementations) you need to specify the type of the argument:

int singles (/* data type */ parameter_name)
{
 //...
}

Edit 1: Changed implementation to function call per @John Bollinger.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM