我的目标是使静态变量“ val”可用于其他.c文件(仅用于实验)。
因此,我创建了一个包含静态变量地址的全局指针,并试图通过该全局指针访问另一个文件中的静态变量的值。
但是
static int val=33;
int *ptr;
ptr = &val;
给我错误。
如果我这样做,它就可以工作。
static int val=33;
int *ptr = &val;
为什么?
答案 0 :(得分:2)
做
在 global 范围内static int val=33; int *ptr; ptr = &val; /* define a global variable with an init value */
定义全局变量,对于编译器,在ptr = &val;
行中, ptr 的隐式类型为 int 。因此这与int*
不兼容。您不能在全局范围内进行赋值,这就是ptr = &val;
不是先前定义的 ptr 赋值,而是具有初始值的全局变量的定义的原因。
将代码放在本地范围内没有问题,例如
int main()
{
static int val=33;
int *ptr;
ptr = &val; /* an assignment of ptr */
}
编译没有问题
答案 1 :(得分:1)
您使用的是旧的或质量差的编译器,其中假设int
为丢失的类型。
在文件范围内,诸如ptr = &val;
之类的表达式语句不是标准C的一部分。编译器正在尝试将其视为声明语句。为此,它假定类型为int
,就像语句是:
int ptr = &val;
由于ptr
先前已被声明为int *
,因此此新的类型为int
的声明发生了冲突,并且编译器报告存在冲突的类型。
C 2018 6.7.2 2为声明指定了约束:
在每个声明的声明说明符中,以及在每个struct声明和类型名称的说明符限定符列表中,至少应提供一个类型说明符。
当违反约束时,编译器应发出有关该约束的诊断消息。因此,好的编译器会警告说缺少类型说明符(不仅是结果默认类型与先前的声明冲突)。