所以,AFAIK你可以在C语言中声明一个名字,只要你愿意,但你不能重新定义一个名字超过一次。另外,根据我的想法,声明是指当一个名字被引入时,比如说,编译器会把这个名字添加到符号表中。比如说,编译器会把这个名字添加到符号表中,就是这个时候。定义是指为一个名字分配内存的时候。现在,这里的名称 p 正在再次声明。它没有被再次定义。
#include <iostream>
#include <cmath>
float goo(float x)
{
int p = 4;
extern int p;
cout << p << endl;
return floor(x) + ceil(x) / 2;
}
int p = 88;
但是,我得到以下错误。
iter.cpp: In function ‘float goo(float)’:
iter.cpp:53:16: error: redeclaration of ‘int p’
extern int p;
^
iter.cpp:52:9: note: previous declaration ‘int p’
int p = 4;
根据我的说法, int p = 4;
应该在调用栈中为p分配内存,即引入一个新的局部变量。然后,extern int p应该再次声明p。现在p应该引用全局变量p,这个p应该在函数goo的所有后续语句中使用。
你可以在C语言中声明一个名字,只要你愿意,就可以多次声明,但你不能重新定义一个名字超过一次。
这是错误的,或者至少是不完整的。如果你在同一个作用域中有多个使用相同名称的声明,它们必须都声明相同的东西。例如,您不能声明 p
同时是一个局部变量的名称和一个外部变量的名称。
如果你想对不同的事物使用相同的名称,那么声明必须在不同的作用域中。例如
{
int p = 4;
{
extern int p;
extern int p; // Declare the same thing twice if you want.
std::cout << p << std::endl;
}
return floor(x) + ceil(x) / 2;
}
用名 p
为两个不同的变量,并使用不同的范围来区分这些含义。所以这不再是一个错误。这是不可取的,因为这会让人类程序员感到困惑,但就编译器而言,它是可以接受的。
在函数 gcd
名称 p
被声明了两次,引用了不同的对象。
float goo(float x)
{
int p = 4;
extern int p;
cout << p << endl;
return floor(x) + ceil(x) / 2;
}
int p = 88;
第一次声明是
int p = 4;
,声明了一个局部变量。
而第二个声明是
extern int p;
的外部变量,该变量指的是在此语句中定义的
int p = 88;
所以编译器发出错误,因为有模棱两可的声明。