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