C - 为什么我收到以下代码的编译错误"error: conflicting types for ‘ptr’ "?静态整数值=33;int *ptr;//=&val; ptr=&val;



我的目标是使一个可用的.c文件可用静态变量'val'(仅用于实验(。

因此,我制作了一个全局指针,该指针包含静态变量的地址,并且通过此全局指针,我试图在另一个文件中访问静态变量的值。

但是,

static int val=33;
int *ptr;
ptr = &val;

给我错误。

如果我这样做,它可以工作。

static int val=33;
int *ptr = &val;

为什么?

static int val=33;
int *ptr;
ptr = &val; /* define a global variable with an init value */

global 范围您定义全局变量,对于编译器,在行ptr = &val;中的 ptr is ptr is int 的隐式类型与int*兼容。您不能在全局范围上进行分配,这就是为什么ptr = &val;不是先前定义的 ptr的分配,而是具有初始值的全局变量的定义。

将代码放在本地范围内没有问题,例如

int main()
{
  static int val=33;
  int *ptr;
  ptr = &val; /* an assignment of ptr */
}

毫无问题的编译

您正在使用质量或差的编译器,该编译器假设int用于缺失类型。

在文件范围内,诸如ptr = &val;之类的表达式语句不是标准C的一部分。编译器正在尝试将其视为声明语句。为此,它假定了一种 int,就好像该语句是:

int ptr = &val;

由于ptr以前被声明为int *,因此具有int类型冲突的新声明,编译器报告有冲突类型。

C 2018 6.7.2 2指定声明的约束

在每个声明中的声明说明符中至少应给出一个类型的指定词,在每个struck-qualifier列表中的每个struct-qualifier列表中都应给出。

当违反约束时,编译器应就其发出诊断信息。因此,一个好的编译器会警告类型说明器缺少类型(而不仅仅是所产生的默认类型与先前的声明发生冲突(。

相关内容

  • 没有找到相关文章

最新更新