函数局部范围中变量的重复标识符

时间:2013-03-03 03:50:43

标签: c variables function-pointers identifier

所以,这是我朋友的学生的代码......

#include <stdio.h>

int main(){
    int hours;
    int take_one_number(void);{
        scanf("%d",&hours);
    }
    int minutes;
    int take_one_number(void);{

        scanf("%d",&minutes);
    }
    int seconds;
    int take_one_number(void);{

        scanf("%d",&seconds);
    }
    int all;
    printf("%d",all=hours*3600+minutes*60+seconds);
    return all;

}

嗯,它...编译......和......嗯,工作......按照老师的要求......

我的问题:如果我理解正确,take_one_number这里是存储函数指针的变量的定义。为什么GCC和LLVM都没有抱怨这些定义中的重复标识符?

4 个答案:

答案 0 :(得分:4)

函数take_one_number被声明3次,但从未定义过。在每种情况下,;在(无效)结束声明之后。然后scanf语句只是main()内部的常规语句,被无意义的范围{}

包围

答案 1 :(得分:3)

在上面的代码中,

 int take_one_number (void);

不是函数指针,它是函数原型或声明,函数可以多次声明,但必须只定义一次。

答案 2 :(得分:2)

int take_one_number(void);

这是一个函数声明,其返回类型为int。它不是变量的定义。你为变量做的范围在这里没什么意义,因为它没有发生变量声明。

答案 3 :(得分:2)

int take_one_number(void);是一个函数原型,用于告诉编译器在某个地方使用此名称和属性实现了一个函数。编译器没有抱怨,因为你既没有定义新功能也没有使用该功能。

您还应该注意,此原型之后的块不是take_one_number的一部分,因为它们用分号分隔。将块作为独立的范围块。为了使事情更清楚,如果函数原型和它旁边的代码块之间没有分号,则会出现编译错误。