所以,这是我朋友的学生的代码......
#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都没有抱怨这些定义中的重复标识符?
答案 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的一部分,因为它们用分号分隔。将块作为独立的范围块。为了使事情更清楚,如果函数原型和它旁边的代码块之间没有分号,则会出现编译错误。