我的目标是使一个可用的.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列表中都应给出。
当违反约束时,编译器应就其发出诊断信息。因此,一个好的编译器会警告类型说明器缺少类型(而不仅仅是所产生的默认类型与先前的声明发生冲突(。