因此,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的所有后续语句中使用。
在函数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;
因此编译器会发出错误,因为存在不明确的声明。
您可以在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
用于两个不同的变量,并使用不同的作用域来区分这些含义。因此,这不再是一个错误。这是不可取的,因为它会混淆人类程序员,但就编译器而言,这是可以接受的。