c中的函数声明范围

时间:2015-06-28 12:24:53

标签: c function calling-convention function-declaration

我已经在各个地方读过,在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);
}

2 个答案:

答案 0 :(得分:2)

在C99标准之前,如果编译器在同一范围内看到函数调用而没有函数声明,则假定函数返回fun1

fun2fun3 都没有在他们调用之前声明 main,他们也没有在fun3中看到声明; mainmain的声明仅限于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标准中,如果当时不存在,编译器可以猜测函数声明调用,这可能是你的情况:编译器在fun3fun1fun2中看到fun3的调用,并推断(猜测)参数基于您在调用中传递的参数的类型。