代码块在命令中编译的程序与gcc不同

Mic*_*chi 3 c

我今天尝试检查答案,我意识到,如果我使用代码块(使用gcc),我必须使用gcc处理与命令行(Ubuntu Linux)不同的错误.

该计划是这样的:

#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;
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试编译它我得到:

错误:函数'abs'的隐式声明[-Werror = implicit-function-declaration] |

所以这是有趣的事情.我将-lm添加到Compiler => global compiler => settings => Other settings,但结果是一样的.

它只在我包含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;
}
Run Code Online (Sandbox Code Playgroud)

但是如果我使用命令使用命令行(在终端中):

   gcc program.c -o program -lm
Run Code Online (Sandbox Code Playgroud)

该程序编译成功.

我的问题:为什么会这样?我做了一个INTERENT的研究和发现,一些人说的ABS功能在声明stdlib.h中,而不是MATH.H.但如果我在命令行中编译(不包括stdlib.h)与-lm工作.我糊涂了.

小智 5

简答:试试

gcc -Wall -Wextra -pedantic -o program -lm
Run Code Online (Sandbox Code Playgroud)

要么

gcc -Wall -Wextra -Werror -pedantic -o program -lm
Run Code Online (Sandbox Code Playgroud)

如Codeblocks似乎那样使警告失败.

答案很长:链接到库与包含头文件完全不同.在C中,由于历史原因,"允许"使用声明的函数.在这种情况下,编译器假定一个函数返回int并接受你给它的任何参数.因为abs(),这些假设成立.所以稍后,链接器在链接时找到该函数libm,一切都很好.

但是有很多捕获:如果你不启用警告,首先你会错过简单的拼写错误.其次,编译器无法检查您提供的参数 - >提前崩溃程序.如果函数确实返回了除了之外的其他东西,那么更多的问题是期望的int.

abs()宣布在stdlib.h.要使用它,请包含此标头.并始终启用编译器警告(Codeblocks显然为您做到了).