Michi
Michi

Reputation: 5297

Codeblocks compile different my program than gcc in comand

I was trying today to check an Answer and I realized that if i use codeblocks (with gcc) i have to treat the error different from the command line (Ubuntu Linux) using gcc.

The program is like this:

#include<stdio.h>
#include<math.h>

int main(void){
    double len,x,y =0;
    int n=123456;

    len=floor(log10(abs(n))) + 1;

    x = n / pow(10, len / 2);
    y = n - x * pow(10, len / 2);

    printf("First Half = %f",x);
    printf("\nSecond Half = %f",y);

    return 0;
}

And if i try to compile it i get:

error: implicit declaration of function ‘abs’ [-Werror=implicit-function-declaration]|

So here is the funny thing. I added -lm to the Compiler => global compiler => settings => Other settings, but the result is the same.

It is working only if i include stdlib.h.

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int main(void){
    double len,x,y =0;
    int n=123456;

    len=floor(log10(abs(n))) + 1;

    x = n / pow(10, len / 2);
    y = n - x * pow(10, len / 2);

    printf("First Half = %f",x);
    printf("\nSecond Half = %f",y);

    return 0;
}

But if I use command line (in terminal) using the comand:

   gcc program.c -o program -lm

The program compiled successfully.

My question: Why happens this ? I did a research on interent and found that some people says the abs function is declared in stdlib.h, not math.h. but if i compile in command line (without including stdlib.h) with -lm works. I'm confused.

Upvotes: 3

Views: 215

Answers (1)

user2371524
user2371524

Reputation:

Short answer: Try

gcc -Wall -Wextra -pedantic -o program -lm

or

gcc -Wall -Wextra -Werror -pedantic -o program -lm

to make it fail on warnings as Codeblocks seems to do.

Long answer: Linking to a library is a completely different matter than including a header file. In C, for historic reasons, it is "allowed" to use a function that is not declared. The compiler in this case assumes a function returning int and taking whatever arguments you give it. For abs(), these assumptions hold. So later, the linker finds the function when linking with libm and everything is fine.

But there are quite some catches: First you will miss simple typos if you don't enable warnings. Second, the compiler is unable to check the arguments you give -> crashing program ahead. And even more problems are to expect if the function does return something other than int.

abs() is declared in stdlib.h. To use it, include this header. And always enable compiler warnings (Codeblocks obviously does it for you).

Upvotes: 5

Related Questions