局部变量和函数在C中可以具有相同的名称吗?

假设我有一个.c文件,其中我有一个局部变量a 。 我也可以在那个具有相同名称 c文件中有一个函数吗?

编辑:如果没有,为什么?

从概念上讲,局部变量存储在堆栈中 ,函数存储在内存的文本部分中。 所以应该没问题吧?

当我尝试这个时,编译器给出了错误。 我想知道这是编译器特定的还是实际上是一个错误。

我假设你有类似的东西:

void a (void) { // whatever } int main(void) { int a; a++; // no problem, boss a(); // <-- compiler tantrum: variable used as a function // whatever } 

您获得的错误是由于您使用a是函数。

每次打开花括号时,都会定义一个新的本地范围,您可以在其中自由重新定义更高范围内的符号。

在这种情况下,块内的标识符引用局部变量,因此您不能将其用作函数。
at toplevel是一个函数,但是在块内部,它被具有相同名称的局部变量定义遮蔽。
这意味着您无法从该块(以及任何其他嵌入的子块)中调用函数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 } } 

我不会这样做。 请改用专有名称。