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

标签 c++ pointers reference

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

相关文章:

c++ - 指向指针的指针与指向指针的引用之间的区别 (C++)

条件跳转或移动取决于 C 中未初始化的值

.net - 引用的 DLL 未复制到引用项目

c++ - 对非常量的引用的初始值必须是左值,通过引用错误传递对象类型

C++ 继承的虚方法仍然使用基类实现

c++ - 为结构变量动态赋值

c++ - 如何处理带有指针的 map ?

c++ - 什么时候在函数中对 const 值使用 const 引用?

c++ - 将指针传递给指向函数的指针

c++ - 按值和按引用区别函数模板