4

所以,这是我朋友的一个学生的代码……</p>

#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;

}

嗯,它……编译……并且……嗯,工作……按照老师的要求……</p>

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

4

4 回答 4

4

函数 take_one_number 被声明了 3 次,但从未定义。在每种情况下, ; 在 (void) 结束声明之后。scanf 语句只是 main() 中的一个常规语句,被一个无意义的范围 { } 包围

于 2013-03-03T03:54:38.817 回答
3

在上面的代码中,

 int take_one_number (void);

is not a function pointer , it is function prototype or declaration , a function can be declared more than once , but must be defined only once.

于 2013-03-03T03:56:21.913 回答
2
int take_one_number(void);

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

于 2013-03-03T03:54:59.150 回答
2

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

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

于 2013-03-03T03:55:37.807 回答