【疑问】为什么声明和定义要分离

前言

我们在学习的时候接触过一个话:编写自定义函数的时候 要做到声明和定义分离 那么为什么呢 今天就来简单的了解一下

疑问:错误的发生

下面给出两个源文件和一个头文件以及报错信息

text.cc文件

#include"head.h"int main()
{int a = 1, b = 2;ADD(a, b);return 0;
}

t.cc文件

#include"head.h"

head.h文件

#include<stdio.h>int ADD(int a, int b)
{printf("ADD(a+b) = \n");return a + b;
}

运行 报错如下:
在这里插入图片描述
可以看到是一个链接错误 重定义

分析原因

ADD函数在编译的时候 在text.c 和t.c中各有一份 即会生成text.o t.o
那么在链接的时候 将这两个文件和在一起之后 就有两个名为ADD的函数 并且不构成函数重载

所以就会报错

#pragma once的作用

它的作用是 解决头文件重复包含的问题
无法解决它

解决方法

声明与定义分离

这样做之后 在text.cc文件中 调用ADD函数 但没找到它的地址 那么在链接的时候就会去符号表找到合适的函数、找到地址 再去调用它
这样就只有一份ADD函数了

静态函数

static在修饰函数的时候 会改变函数的链接属性 使其只在当前文件可见
意思就是 不会进入符号表

和内联联系

内联函数不支持声明和定义分离 为什么呢?
因为内联函数在调用的地方直接展开 那么就不需要存进符号表

补充:用内联和静态的方式 都可以写在头文件中

结语

这次的初步介绍到此为止 希望你有收获

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

共用体与枚举法,链表的学习

结构体注意事项&#xff1a; 1.结构体类型可以定义在main函数里面&#xff0c;但是此时的作用域就被限定在该函数中 2.结构体的的的定义的形式&#xff1a;a.先定义类型&#xff0c;后定义变量-----struct stu s b.定义类型的同时&#xff0c;定义了变量&#xff1a;struct…

由数据插入超长引起的问题——了解GaussDB和openGauss的字符集

前言 故事是这样开始的。我们的小DEMO项目的数据库版本从openGauss 2.1.0升级到了5.0.0版本。升级后进行功能验证的时候&#xff0c;测试同学发现个BUG&#xff0c;原来通过gs_restore导出来的数据再导入时报超长&#xff0c;插入失败了&#xff0c;如下图所示&#xff0c;nva…

【GitHub项目推荐--开箱即用的直播聊天系统,高颜值,支持二次开发】【转载】

Owncast Owncast 是一个免费开源的实时视频和网络聊天服务器&#xff0c;可与现有流行的广播软件一起使用。 github源代码&#xff1a; https://github.com/owncast/owncast 国内镜像(中文) http://www.gitpp.com/samgoat/owncast-cn 项目介绍 Owncast 是一个开源的、可…

MongoDB从入门到实战之MongoDB简介

前言 相信很多同学对MongoDB这个非关系型数据库都应该挺熟悉的&#xff0c;在一些高性能、动态扩缩容、高可用、海量数据存储、数据价值较低、高扩展的业务场景下MongoDB可能是我们的首选&#xff0c;因为MongoDB通常能让我们以更低的成本解决问题&#xff08;包括学习、开发、…

1751 - 快乐的马里奥

题目 马里奥是一个快乐的油漆工人&#xff0c;这天他接到了一个油漆任务&#xff0c;要求马里奥把一个 n 行 m 列的矩阵每一格都用油漆标记一个数字&#xff0c;标记的顺序按照广度优先搜索的方式进行&#xff0c;也就是他会按照如下方式标记&#xff1a; 1、首先标记第 1 行…

消息总线在微服务中的应用

直连式配置中心 上一篇文章介绍了 Spring Cloud 中的分布式配置组件 Config&#xff0c;每个服务节点可以从Config Server 拉取外部配置信息。但是似乎还有一个悬而未决的问题&#xff0c;那就是当服务节点数量非常庞大的时候&#xff0c;我们不可能一台一台服务器挨个去手工触…

使用 Dockerfile 定制镜像详解

使用 Dockerfile 定制镜像详解 1.DockerfileFROM 指定基础镜像RUN 执行命令构建镜像 2.COPY 复制文件3.ADD 更高级的复制文件4.CMD 容器启动命令5.ENTRYPOINT 入口点6.ENV 设置环境变量7.ARG 构建参数8.VOLUME 定义匿名卷9.EXPOSE 暴露端口10.WORKDIR 指定工作目录11.USER 指定…

使用Python的Turtle模块简单绘制烟花效果

import turtle import random# 初始化屏幕 screen turtle.Screen() screen.bgcolor("black") screen.title("烟花模拟")# 创建一个Turtle来绘制烟花 firework turtle.Turtle() firework.hideturtle() firework.speed(0) # 设置绘图速度为最快# 绘制烟花…

Pycharm安装插件

经常用Pycharm写代码的话&#xff0c;时不时的就会接触到一些好用的插件&#xff0c;如何安装插件呢&#xff1f;经常使用的是两种方式&#xff0c;分别是在线安装和离线安装。 在线安装 在线安装比较简单&#xff0c;打开Pycharm&#xff0c;在左上角【文件】->【设置】-…

蓝桥杯备战——10.超声波模块

1.分析原理图 蓝桥杯单片机板子的原理图做的简直是依托答辩&#xff0c;乱糟糟的不说还弄成黑白的&#xff0c;明明很简单的东西&#xff0c;弄成一大堆。 可以看到&#xff0c;J2跳线帽如果P10接N_A1,P11接N_B1就是用作超声波功能。N_A1用作发生超声波功能&#xff0c;而N_B1…

uniapp基于Android平台的古诗词学习挑战系统 微信小程序_b7obw

APP性能需求 &#xff08;1&#xff09;用户在安卓APP页面各种操作可及时得到反馈。 &#xff08;2&#xff09;该平台是提供给多个用户使用的平台&#xff0c;用户使用之前需要注册登录。登录验证后&#xff0c;用户才可进行各种操作[10]。 &#xff08;3&#xff09;管理员用…

单臂路由实验(思科)

一&#xff0c;实验目的 在路由器的一个接口上通过配置子接口的方式&#xff0c;实现相互隔离的不同vlan之间互通。 二&#xff0c;设备配置 Switch1 Switch>enable 全局模式 Switch#configure terminal 配置模式 Switch(config)#vlan 10 …