Charana
Charana

Reputation: 1072

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 it's 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.

The error I get 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, but that won't work. I tried importing the header to try to avoid this error, but it doesn't seem to work.

Upvotes: 10

Views: 86961

Answers (2)

Thomas Matthews
Thomas Matthews

Reputation: 57698

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.

Upvotes: 4

dbush
dbush

Reputation: 223972

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

Upvotes: 13

Related Questions