【发布时间】:2015-09-26 15:21:47
【问题描述】:
有人知道为什么这个 c 程序会编译并使用 math.h 的 sqrt 吗?
这将输出 2.236068
main.c
#include <stdio.h>
#include "math_utils.h"
int main(void){
printf("%f\n", sqrt(5));
return 0;
}
math_utils.h
#ifndef MATH_UTILS_Hs
#define MATH_UTILS_Hs
double sqrt(double number){
return number + 5;
}
#endif // MATH_UTILS_Hs
我目前在 windows 上使用 mingw GCC
【问题讨论】:
-
GCC 有一个内置的
sqrt函数,它可能会用对其内置函数的调用替换您的调用。既然您定义了该函数,它应该真正使用您的定义,也许是 GCC 中的错误?您使用的是什么版本的 GCC? -
我目前使用的是 4.8.3,我尝试删除 math_utils.h,它会给我这个错误
main.c:5:18: warning: incompatible implicit declaration of built-in function 'sqrt' [enabled by default] -
@JoachimPileborg 我相信 gcc 假定任何已识别函数的定义在范围内,它总是会执行 gcc 认为该函数应该执行的操作。
-
来自标准(我的免费草稿副本)的第 7.1.3 节:“如果程序在保留它的上下文中声明或定义标识符(7.1.4 允许的除外) ),或将保留标识符定义为宏名称,则行为未定义。”也就是说, sqrt 不能用作函数的名称。所以这似乎是未定义的行为,而不是 GCC 中的错误。