gpt4 book ai didi

c++ - 带/不带指针的函数原型(prototype)使用区别

转载 作者:行者123 更新时间:2023-12-01 15:05:13 24 4
gpt4 key购买 nike

我正在学习简单的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com