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

时间:2014-01-24 06:19:19

标签: c

假设我有一个单个 .c文件,其中我有本地变量 a 。我可以在该c文件中有一个功能,其中相同名称 a

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

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

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

4 个答案:

答案 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
    }
}
但是,我不会这样做。改为使用专有名称。