2014-01-21 47 views
2

我在CPP中有下面的代码。C++中的函数声明

//My code 

#include<iostream> 
using namespace std; 
int main() 
{ 
    int a; 
    int display(); 
    int printfun(display());// Function prototype 
    printfun(9);//Function calling 
    return 0; 
} 
int printfun(int x) 

{ 
    cout<<"Welcome inside the function-"<<x<<endl; 
} 
int display() 
{ 
    cout<<"Welcome inside the Display"<<endl; 
    return 5; 

} 

编译时会引发错误“Line8:'printfun'不能用作函数”。

但是,当我在显示函数中进行printfun调用时,相同的代码完美地工作。

#include<iostream> 
using namespace std; 
int main() 
{ 
    int a; 
    int display(); 
    int printfun(display());// Function prototype 
     return 0; 
} 
int printfun(int x) 

{ 
    cout<<"Welcome inside the function-"<<x<<endl; 
} 
int display() 
{ 
    printfun(9); // Function call 
    cout<<"Welcome inside the Display"<<endl; 
    return 5; 

}

谁能解释这背后的原因是什么?

+0

而不是'int printfun(display());'try'int printfun(int x)'。正如代码中提到的那样,这两行声明了函数原型,其中函数将在稍后实施。那么,请看Kugelman的答案:D – wendelbsilva

回答

7
int printfun(display());// Function prototype 

这不是函数原型。这是一个变量声明,等同于:

int printfun = display(); 

函数原型“可以”里面的main()来实现,但它更正常的把它们在你的源文件的顶部。

#include <iostream> 

using namespace std; 

// Function prototypes. 
int display(); 
int printfun(int x);  

int main() 
{ 
    int a; 
    printfun(9); // Function call. 
    return 0; 
} 

// Function definitions. 
int printfun(int x) 
{ 
    cout << "Welcome inside the function-" << x << endl; 
} 

int display() 
{ 
    printfun(9); // Function call. 
    cout << "Welcome inside the Display" << endl; 
    return 5; 
} 
+0

感谢John的回复。但我的问题是,当我给另一个函数内部的函数调用而不是主函数时,修改的代码(我已发布)如何将它完美地视为函数原型? –

1

在这份声明中

int printfun(display());// Function prototype 

你定义一个名为printfun int类型是由函数调用显示的返回值初始化的对象()。你认为这不是一个函数声明。

那么作为printfun是int类型的对象,然后表达

printfun(9);// 

没有任何意义和编译器将发出一个错误。

在第二种情况下,代码被编译,因为功能显示看到声明为函数名称的全局名称printfun。 main中的printfun在main之外不可见。事实上,对于在main和全局函数名称中定义的局部变量,它是在全局名称空间内声明的函数名称。功能显示看到这个全球名称。