gpt4 book ai didi

c - 为什么 sqrt() 和 abs() 在不包含 math.h 或 stdlib.h 的 C 程序中工作?

转载 作者:行者123 更新时间:2023-12-04 10:07:51 25 4
gpt4 key购买 nike

下面是我的一些 C 代码。正如你所看到的,我包含的唯一标题是 stdio.h .但是,我收到警告 abs有一个相互矛盾的声明:note: 'abs' is a builtin with type 'int (int)'sqrt无需使用我的功能即可工作。

我的编译器版本:Apple LLVM version 8.0.0 (clang-800.0.42.1) .

我正在使用的编译标志:-Wall -pedantic -ansi .

怎么会这样?

#include <stdio.h>

double abs(double x) {
return x >= 0 ? x : -x;
}

double sqrt(double y) {
double x = 1.0;
int error;
printf("My sqrt\n");
if(y <= 0) {
return 0;
}
while(abs(error = y - x * x) > .0005) {
x = x + error/ (2 * x);
}
return x;

}

int main() {
printf("sqrt(%d) = %8.3f\n", 2, sqrt(2.0));
return 0;
}

最佳答案

一些像 gcc 这样的编译器有“builtins ”(我认为有时称为“编译器内在函数”),我认为它们提供了优化。这就是为什么您可以使用这些函数而不必链接到 libm

Compiler intrinsics (sometimes called "builtins") are like the library functions you're used to, except they're built in to the compiler. They may be faster than regular library functions [Ref]



从 GCC 页面(上面链接):

The ISO C90 functions ... abs, ... sqrt, ... are all recognized as built-in functions unless -fno-builtin is specified ... All of these functions have corresponding versions prefixed with __builtin_.



正如其他人指出的那样,您自己也在声明这些函数。您为这些函数提供的名称与内置函数的名称“冲突”。这就是为什么你会看到 note: 'abs' is a builtin with type 'int (int)'以及为什么当您删除函数时,符号仍然有效。

关于c - 为什么 sqrt() 和 abs() 在不包含 math.h 或 stdlib.h 的 C 程序中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42163811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com