在编译此代码时

#include <math.h>

double *y0;

int main()
{
   return 0;
}

对于来自最新debian-sid的gcc 13.2.0,我得到以下错误:

gcc -o a.out proof.c -Wall -lm
proof.c:3:9: error: 'y0' redeclared as different kind of symbol
    3 | double *y0;
      |         ^~
In file included from /usr/include/features.h:490,
                 from /usr/include/x86_64-linux-gnu/bits/libc-header-start.h:33,
                 from /usr/include/math.h:27,
                 from proof.c:1:
/usr/include/x86_64-linux-gnu/bits/mathcalls.h:223:1: note: previous declaration of 'y0' with type 'double(double)'
  223 | __MATHCALL (y0,, (_Mdouble_));
      | ^~~~~~~~~~
make: *** [Makefile:6: proof] Error 1

请注意,如果我用不同的名称替换*y0,例如*x0,它不会有任何问题. 显然,mathlib的名称存在冲突,但这正常吗?这种冲突应该是可能的,还是只是一个漏洞?

推荐答案

y0是数学库中实现的Bessel function的名称.不应将此名称用于全局变量.

以下是大多数C数学库支持的Bessel函数列表,尽管从C23开始不是C标准的一部分:

double j0(double);
double j1(double);
double jn(int, double);
double y0(double);
double y1(double);
double yn(int, double);

C++相关问答推荐

与unions 的未定义行为

从内联程序集调用Rust函数和调用约定

为什么在C中二维字符数组会有这样的行为?

无效指针值在函数调用之间莫名其妙地改变

ESP32在vTaskDelay上崩溃

从纯C中访问通用项对话框

为静态库做准备中的奇怪行为

ifdef __cplusplus中的整数文字单引号

接受任何参数的函数指针是否与接受不同参数的函数兼容

如何使用FSeek和文件流指针在C中查找文件的前一个元素和前一个减go 一个元素

收到不兼容的指针类型警告,因为函数的返回不是空*,而是 struct 指针

Fprintf正在写入多个 struct 成员,并且数据过剩

将数字的每一位数平方,并使用C将它们连接为一个数字(程序不能正确处理0)

C编译和运行

在git补丁中自动添加C的宏

分支预测和UB(未定义的行为)

malloc 属性不带参数

使用邻接表创建图

在带中断的循环缓冲区中使用 易失性

初始化动态分配的布尔二维数组的最佳方法是什么?