声明和C++定义中的不同类型

Differing types in declaration and definition in C++

本文关键字:同类型 定义 C++ 声明      更新时间:2023-10-16

我正在浏览一段代码,发现了一件奇怪的事情。声明了一个函数,如下所示:

void func(int, int*);

但后来它被定义为

void func(int a, int &p) { ... }

代码在 Linux 下的 gcc 中正确编译。这怎么可能?(它已被构建为C文件)

#include<iostream>
#include<string>
// overloads, nothing to do with func(int, int&)
int func(int, int*);
int func(int, short);
int func(int, std::string);
int func(int a, int& b) {
    return a;
}
int main() {
  int x;
  std::cout << func(4, x) << std::endl;
  return 0;
}

也就是说,采用不同参数的函数是完全不同的函数(即使它们具有相同的名称)。据说这些函数具有不同的签名

定义和声明分别引用不同的函数。更具体地说,是同一函数名称的不同重载。

这:

void func(int, int*);

声明一个采用intint*的函数。

这:

void func(int a, int &p) { ... }

声明并定义一个采用intint&的函数。它们是不同的功能。调用同时看到两者的代码将根据重载解析正常调用适当的代码。

我看不清楚你的问题,但我想你在参数黑白函数调用和函数定义的映射中感到困惑,尤其是指针。使用锁和钥匙概念来理解指针。假设 p 是一个指针变量。&p是它的地址。

现在假设 & 正在充当锁。你想访问的值p指向,所以需要一个键。现在我给你*钥匙打开你的和锁。因此,*(&p) 会给你存储在地址 p 指向的值。