函数重载注意事项

news2024/11/19 16:28:08

C++为什么支持函数重载,C语言不支持函数重载?

C++代码产生函数符号时, 是函数名+参数列表类型组成的!如_Z3sumii

C代码产生函数符号时,只由函数名决定

什么是函数重载?

一组函数,其中函数名相同,参数列表个数或类型不同,那么这组函数称为函数重载

返回值不同不构成重载。

解释什么是多态

静态多态(编译时):函数重载、模板

动态多态(运行时)

先处于同一作用域,才可以谈重载,如下例子

bool compare(int a, int b) // compare_int_int
{
	cout << "compare_int_int" << endl;
	return a > b;
}
bool compare(double a, double b) // compare_double_double
{
	cout << "compare_double_double" << endl;
	return a > b;
}
bool compare(const char *a, const char *b) // compare_const char*_const char*
{
	cout << "compare_char*_char*" << endl;
	return strcmp(a, b) > 0;
}
int main()
{
	bool compare(int a, int b); // 函数的声明,导致编译器不会去外面找别的compare定义,

	compare(10, 20); // call compare_int_int
	compare(10.0, 20.0); // double -> int
	compare("aaa", "bbb"); // const char* => int,error!!!
	return 0;
}

上述代码compare("aaa", "bbb");出错

constvolatile 的情况会影响形参类型(后面细讲),如:

void func(int *a) {}  // int
void func(int *const a) {}  // 错误,重定义
int main()
{
	int a = 10;
	const int b = 10;

	cout << typeid(a).name() << endl;  // int
	cout << typeid(b).name() << endl; // int

	return 0;
}

而如下却是通过编译

void func(int *a) {} // int
void func(int const *a) {}

函数参数 const int 和int的话编译器分不出区别,造成重定义

C++和C语言代码间如何相互调用

在linux上测试时,c文件链接用gcc,c++文件用g++,不然没效果

C++调用C函数

由于符号生成规则的问题,用extern "C "

因为C++中函数声明生成符号带参数类型,而C文件中函数生成符号不带参数类型,两者不匹配,故在函数声明处加extern "C ":

// main.cpp

extern "C"{
  int sum(int a, int b);
}

int main()
{
  int ret = sum(10, 20);
  cout << "ret = " << ret << endl;
  return 0;

}
// test.c

int sum(int a, int b)

{
  return a + b;
}

对main.cpp 编译得到目标文件并查看目标文件符号表

jyhlinux@ubuntu:~/share/cppmid/inline$ g++ -c main.cpp test.c 

jyhlinux@ubuntu:~/share/cppmid/inline$ objdump -t main.o

在这里插入图片描述

可看出此时以C方式生成符号。再对test.c 编译得到目标文件并查看目标文件符号表

jyhlinux@ubuntu:~/share/cppmid/inline$ g++ -c main.cpp 

jyhlinux@ubuntu:~/share/cppmid/inline$ gcc -c test.c

在这里插入图片描述

可以看出定义的符号和声明处的符号一致

最后这里我想通过 ld -lstdc++ main.o test.o -o main生成可执行文件但是失败了。提示ld: cannot find -lstdc++

C调用C++的函数代码

即函数定义写在cpp文件中

// main.cpp
extern "C"
{
    int sum(int a, int b)
    {
        return a + b;
    }
}
// test.c
#include <stdio.h>
int sum(int, int);
int main()
{
    int ret = sum(10, 20);
    printf("ret = %d\n", ret);

    return 0;
}

编译执行成功:

gcc -o main main.cpp test.c

在这里插入图片描述

如果不把定义放在extern "C"中则提示:

在这里插入图片描述

注意:这个extern "C"是写在cpp文件中的!!!!

补:说明一下如下代码意思

#ifdef __cplusplus
extern "C" {
#endif
	int sum(int a, int b) // sum  .text
	{
		return a + b;
	}
#ifdef __cplusplus
}
#endif

C++编译器都内置了__cplusplus宏名,保证了若是以C++编译该该代码,可以保证以C方式生成符号使得不管是在C还是C++文件中定义该函数,都能够在C文件中使用该函数。

参考资料

施磊.C++基础进阶课

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/444699.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

读书笔记-《ON JAVA 中文版》-摘要14[第十四章 流式编程]

文章目录 第十四章 流式编程1. 流支持2. 流创建2.1 流创建2.2 随机数流2.3 int 类型的范围2.4 generate()2.5 iterate()2.6 流的建造者模式2.7 Arrays2.8 正则表达式 3. 中间操作3.1 跟踪和调试3.2 流元素排序3.3 移除元素3.4 应用函数到元素3.5 在 map() 中组合流 4. Optional…

电脑文件恢复怎么做?3个方法快速恢复文件!

案例&#xff1a;电脑文件恢复怎么操作&#xff1f; 【我的电脑已经好久没用了&#xff0c;最近因为需要查看一些相关的文件才用到电脑&#xff0c;但是我打开后发现里面很多重要的文件都不见了&#xff0c;请问电脑文件应该怎么恢复呢&#xff1f;感谢回答&#xff01;】 电…

AIGC从入门到精通

一键起飞 # 提前安装好python 3.10.9 ​git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui cd stable-diffusion-webui ./webui.sh -f --api --listen --enable-insecure-extension-access 非常详细&#xff01;6000字详解AI绘画文生图干货、技巧&#xf…

【多线程】线程的状态

1. 等待一个线程 join 有一天张三与小美在家里吃饭&#xff0c;张三早早的把饭吃完了&#xff0c;对小美说&#xff0c;等你把饭吃完了&#xff0c;我就去洗碗了&#xff01; 此时张三就要等待小美吃完饭才能去洗碗&#xff0c;就好比线程 A 要等待线程 B 执行完&#xff0c;线…

Ansys Lumerical | 光子集成电路之PN 耗尽型移相器仿真工作流

01 说明 本文旨在介绍Ansys Lumerical针对有源光子集成电路中PN耗尽型移相器的仿真分析方法。通过FDE和CHARGE求解器模拟并计算移相器的性能指标&#xff08;如电容、有效折射率扰动和损耗等&#xff09;&#xff0c;并创建用于INTERCONNECT的紧凑模型&#xff0c;然后将其表征…

vue_03

文章目录 导航菜单功能的实现在Admin.vue中添加下列代码布局选择点击跳转事件 vuex的安装及配置安装配置新建store和index.js在index.js下写如下代码在main.js中引入store 封装菜单请求工具类新建menus.js编写menus.js文件 解决F5刷新数据丢失问题 导航菜单功能的实现 在Admin…

多项开发任务,如何做好任务分配和管理?

1、确定任务清单 任务精细化分解 需要将任务进行精细化分解&#xff0c;每个子任务时间最好不超过一周&#xff0c;明确子任务的目标、时间点和交付物。 多项开发任务&#xff0c;如何做好任务分配和管理&#xff1f; 2、优先级排序 需要将精细化好的任务&#xff0c;进行优先级…

TFTP+Filezilla文件双向传输(2)-ubuntu(VMware)-win10(host)

TFTP&#xff08;Trivial File Transfer Protocol,简单文件传输协议&#xff09;是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议&#xff0c;提供不复杂、开销不大的文件传输服务。端口号为69。 ftpd-hpa是tftp服务器 tftp-hpa是tftp客服端 inetd的全称…

设计尝试用Microsoft Visual Studio 在网络上架构一个电影院网络订票系统

设计尝试用Microsoft Visual Studio 在网络上架构一个电影院网络订票系统的设计&#xff0c;以使每一位客户不用出门就能看到最新的电影信息和预定电影票。本文从理论和实践两个角度出发&#xff0c;对一个具有数据挖掘功能电影院网络订票系统的设计进行设计与实现分析。随着电…

windows下运行dpdk下的helloworld

打开“本地安全策略”管理单元&#xff0c;在搜索框输入secpol。 打开本地策略->用户权限分配->锁定内存页->添加用户或组->高级->立即查找 输入电脑用户名&#xff0c;选择并添加。点击确定后&#xff0c;重启电脑。 安装内核驱动&#xff0c;下载地址https:…

srm 采购管理系统是如何赋能企业降本的?

近年来&#xff0c;随着全球经济的不断发展&#xff0c;企业的竞争也日趋激烈&#xff0c;企业为适应市场需求&#xff0c;加强产品创新和技术升级&#xff0c;加大产品研发和生产投入&#xff0c;然而在新冠肺炎疫情的影响下&#xff0c;许多企业经营出现困境。在这种情况下&a…

基于时间戳和序列号的mac地址生成策略

基于时间戳 基于时间戳生成MAC地址的具体操作步骤如下&#xff1a; 获取设备的出厂日期和时间。一般情况下&#xff0c;这个信息可以在设备的测试报告或者出厂记录中找到。 将设备的出厂日期和时间转换成时间戳格式。时间戳指的是一个从1970年1月1日00:00:00 UTC开始的秒数。…

自动化数据驱动?最全接口自动化测试yaml数据驱动实战,看这一篇就够了

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 我们在做自动化测…

ROS学习第十九节——TF静态坐标变换

1.坐标msg消息 订阅发布模型中数据载体 msg 是一个重要实现&#xff0c;首先需要了解一下&#xff0c;在坐标转换实现中常用的 msg:geometry_msgs/TransformStamped和geometry_msgs/PointStamped 前者用于传输坐标系相关位置信息&#xff0c;后者用于传输某个坐标系内坐标点的…

js面试题

在全局作用域下声明了一个变量 arr, 它的初始值是一个空数组 第二段代码&#xff0c;循环计数器变量i的初始值为0&#xff0c;循环条件是i的值小于2&#xff0c; 也就是说当i的值为0或者1时&#xff0c; 循环条件才能成立 才能够进入到循环体 当i的值为2时循环条件不成立&…

ConcurrentLinkedQueue

唯一一个使用cas实现的线程安全并发效率高的集合。 一、为什么叫松散队列&#xff1f; 链表是松散的&#xff0c;链表节点并不都是有效的&#xff0c;允许存在无效节点valnull&#xff0c;但是只有最后一个节点才能nextnull 为什么线程安全需要把链表做成松散的。就是因为入队…

蓝精灵协会 (The Smurfs‘ Society) 宣布与著名艺术家展开一系列的合作,打造传奇 PFP 系列

4 月 18 日&#xff0c;The Smurfs Society 将推出第一个由 Smurfs 品牌支持的官方 PFP 系列。该系列建立在链上游戏的基础之上&#xff0c;该游戏聚集了超过 85,000 名玩家&#xff0c;并在设计、创意和与著名艺术家的合作方面设立了新标准。 而最近&#xff0c;蓝精灵官方&am…

2023-04-21 学习记录--C/C++-实现升序降序(选择法)

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、选择法 —— 升序 ⭐️ &#xff08;一&#xff09;、思路 从左到右&#xff0c;除最后一个数 依次作为 “当前数” 与 其右…

STM32F4_模数转换器(ADC)详解

目录 1. ADC是什么 2. ADC主要特性 3. ADC框图 3.1 ADC开关控制 3.2 ADC时钟 3.3 通道选择 3.4 单次转换模式和连续转换模式 3.5 时序图 3.6 模拟看门狗 4 温度传感器 5. ADC中断 6. ADC初始化结构体 6.1 ADC相关实验配置 7. 相关寄存器 7.1 ADC控制寄存器&…

Deep Neural Network for YouTube Recommendation论文精读

这篇论文 Deep Neural Networks for YouTube Recommendations 是google的YouTube团队在推荐系统上DNN方面的尝试&#xff0c;发表在16年9月的RecSys会议。本文所介绍的YouTube的推荐系统主要包括Deep Candidate Generation model和Deep Ranking model两个部分&#xff1a;Deep …