我已经在各个地方读过,在main()中声明的函数不能在main之外调用。但是在下面的程序中,fun3()在main()中声明,在其他函数中调用main(),IT WORKS,给出输出64.here的链接 http://code.geeksforgeeks.org/7EZZxQ。但是,如果我将fun3()返回类型int更改为void,则无法编译,这是什么行为的原因?
#include <stdio.h>
#include <stdlib.h>
int main()
{
void fun1(int);
void fun2(int);
int fun3(int);
int num = 5;
fun1(num);
fun2(num);
}
void fun1(int no)
{
no++;
fun3(no);
}
void fun2(int no)
{
no--;
fun3(no);
}
int fun3(int n)
{
printf("%d",n);
}
当改变fun3()的声明时,编译失败。
#include <stdio.h>
#include <stdlib.h>
int main()
{
void fun1(int);
void fun2(int);
void fun3(int); //fun3 return type changed to void error in compilation
int num = 5;
fun1(num);
fun2(num);
}
void fun1(int no)
{
no++;
fun3(no);
}
void fun2(int no)
{
no--;
fun3(no);
}
void fun3(int n) //fun3 return type changed to void error in compilation
{
printf("%d",n);
}
答案 0 :(得分:2)
在C99标准之前,如果编译器在同一范围内看到函数调用而没有函数声明,则假定函数返回fun1
。
fun2
和fun3
都没有在他们调用之前声明 main
,他们也没有在fun3
中看到声明; main
中main
的声明仅限于fun3
的正文。在C89及更早版本中,编译器将假定对int
的调用返回fun3
。在第一个示例中,int
的定义返回fun3
,因此代码将在C89编译器下编译。在第二个示例中,void
的定义返回int
,它与假定的int
类型不匹配,因此代码无法编译。
在C99及更高版本的标准下, 代码段都不会编译;编译器不再假定函数调用的隐式public MainWindow()
{
InitializeComponent();
fontSizeComBox.ItemsSource = new List<double>() { 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72 };
}
private void fontSizeComBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
Run r = new Run();
Paragraph p = new Paragraph();
r.FontSize = (double)fontSizeComBox.SelectedValue;
richTextBox.CaretPosition.Paragraph.Inlines.Add(r);
richTextBox.CaretPosition = r.ElementStart;
richTextBox.Focus();
}
声明。 所有函数必须在调用之前显式声明或定义。
答案 1 :(得分:1)
声明仅在声明它们的范围内有效。但是,在较旧的C标准中,如果当时不存在,编译器可以猜测函数声明调用,这可能是你的情况:编译器在fun3
,fun1
和fun2
中看到fun3
的调用,并推断(猜测)参数基于您在调用中传递的参数的类型。