У меня есть код ниже в CPP.
//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;
}
Кто-нибудь может объяснить причину этого?
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;
}
В этом заявлении
int printfun(display());// Function prototype
Вы определяете объект типа int с именем printfun, которое инициализируется возвращаемым значением вызова функции display (). Это не объявление функции, как вы думаете.
Так как printfun является объектом типа int, то выражение
printfun(9);//
не имеет никакого смысла и компилятор выдает ошибку.
Во втором случае код компилируется, потому что функция display видит глобальное имя printfun, которое объявлено как имя функции. printfun внутри main не виден снаружи main. Фактически вы используете одно и то же имя для локальной переменной, определенной в main, и для глобального имени функции, которое является именем функции, объявленным внутри глобального пространства имен. Функция display видит это глобальное имя.