假设我有一个单个 .c文件,其中我有本地变量 a 。我可以在该c文件中有一个功能,其中相同名称 a ?
编辑:如果没有,为什么?
从概念上讲,局部变量存储在堆栈上,函数存储在内存的 text 部分。所以应该没问题吧?
当我尝试这个时,编译器给出了错误。我想知道这是否是编译器特定的,或者它实际上是一个错误。
答案 0 :(得分:8)
我认为你有类似的东西:
void a (void)
{
// whatever
}
int main(void)
{
int a;
a++; // no problem, boss
a(); // <-- compiler tantrum: variable used as a function
// whatever
}
您获得的错误是由于您使用a
作为函数。
每次打开花括号时,都会定义一个新的局部范围,您可以在其中自由重新定义更高范围内的符号。
在这种情况下,块内的标识符a
引用局部变量,因此您不能将其用作函数。
顶层的a
是一个函数,但是在块内部,它被具有相同名称的局部变量定义遮蔽。
这意味着您无法从该块(以及任何其他嵌入的子块)中调用函数a
。 (更准确地说,你不能通过名称来访问函数a
,但你仍然可以通过在该范围内访问该函数的指针来调用它。)
这应该是为您的函数和其他全局符号定义有意义的名称的动机,因为它们必须在顶层范围内共存 和 冒险存在被任何较低范围的符号所遮蔽。
正如其他答案所述,其他语言中有一些机制,如C ++,称为“范围分辨率修饰符”,它允许明确指定符号的范围,但在C中不存在。
答案 1 :(得分:5)
你不能因为如果你有example(),'example'是指向该函数的指针。
答案 2 :(得分:5)
您可以声明与全局变量同名的局部变量,但局部变量将 shadow 全局变量。只要您的本地a
在范围内,符号a
就会引用您的本地变量。
某些语言允许通过特殊语法引用全局符号,例如::a
或.a
。 C不是这些语言之一。
(作为旁注:您不应该给出可能干扰本地人的全局函数名称。本地人的姓名通常很短并且没有太多信息 - 因为上下文清楚,所以不需要它。全局变量必须与其他变量共享一个大的命名空间。建议在您的名称中提供一些上下文,以避免名称冲突和阴影。)
答案 3 :(得分:3)
为了完成起见,实际上有一种方法可以引用全局标识符,即使它们在C中被遮蔽。
在kuroi neko的片段中,看起来像这样:
void a (void)
{
// whatever
}
{
int a;
a++; // no problem, boss
{
extern void a(void);
a(); // no problem either
}
}
但是,我不会这样做。改为使用专有名称。