我今天尝试检查答案,我意识到,如果我使用代码块(使用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显然为您做到了).