我正在学习简单的 C++ 教程。
#include <iostream>
using namespace std;
int main()
{
int a = 1, b = 2;
cout << "Before swapping " << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
swap(a,b);
cout << endl;
cout << "After swapping " << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
return 0;
}
void swap(int &n1, int &n2)
{
int temp;
temp = n1;
n1 = n2;
n2 = temp;
}
上面的代码工作正常(g++ 和 icc),但是如果我在函数中使用指针,如果我没有在程序的开头包含原型(prototype),代码就会失败。#include <iostream>
using namespace std;
void swap(int*, int*); // The code fails if I comment this line.
int main()
{
int a = 1, b = 2;
cout << "Before swapping" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
swap(&a, &b);
cout << endl;
cout << "After swapping" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
return 0;
}
void swap(int* n1, int* n2)
{
int temp;
temp = *n1;
*n1 = *n2;
*n2 = temp;
}
据我所知,C++编译过程是自上而下的,所以第二段代码似乎更合理,其中函数的信息在int main()
之前提供。遇到。我的问题是,为什么第一个代码即使在 int main()
之前没有函数知识也能正常工作?
最佳答案
第一个程序的问题是您实际上并没有调用自己的 swap
功能。在文件的顶部,您有:
using namespace std;
这带来了std::swap
进入范围,这就是你实际调用的函数。如果你把 cout
您自己的声明swap
你会看到它实际上从未被调用过。或者,如果您声明您的 swap
之前 main
,你会得到一个模棱两可的电话。请注意,此代码不需要像这样运行,因为
iostream
不一定带std::swap
进入范围,在这种情况下,您将收到没有 swap
的错误打电话。在第二个程序中,调用
swap(&a, &b)
失败,因为 std::swap
没有过载接受 2 个临时指针。如果您声明您的 swap
main
中调用前的函数,然后它调用你自己的函数。您的代码中真正的错误是
using namespace std;
.永远不要这样做,你会避免这种性质的问题。
关于c++ - 带/不带指针的函数原型(prototype)使用区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63570032/