认真复习c语言1

news2024/11/13 10:50:36

最近好好写总结了(不能在偷懒了):这一次绝对认真,写总结写了三个多小时,学了一个小时左右TAT;

今天来复习一下c语言的多文件操作:

经过我这几天的摸索,我算是明白了:

先来总结几个常识便于下面的代码解读:

一般,我们初学c语言的时候都是用codeblocks在一个文件里面操作,但是在用vs开始写项目的时候一般都是多文件操作,这里就先来看一下多文件操作的小知识;

1.在写c语言预处理指令的时候一般我们都是用<>这种尖括号来包含要打开的文件;这里来了解一个新的“”引号,它打开的范围比<>要广一点,尖括号仅会在编译器包含目录中搜索文件,而引号不仅可以在编译器包含目录里面搜索文件,还可以在当前的文件目录下;

2.还有在多文件处理的时候经常可以遇见这样的问题:

错误    LNK1169    找到一个或多个多重定义的符号;

这就是说明在两个文件里面定义了多个相同标识符,这时候就要删除一个(记得举个例子),而这里还要了解编译器是如何处理代码的:编译器是单个单个文件编译的,首先进行预处理,修改源代码(修改后的源文件会直接放入编译器或者在中间文件中,所以不用担心加入预处理指令会修改当前代码),再将预处理后的源代码转化成二进制目标文件,最后将需要用到的目标文件合并成可执行文件;

可能说还是有点难以理解,所以我这不是来搬例子来了:

#include"print.h"
int main()

{
	print("hello\n");
	return 0;
}

 在这里有一个头文件print.h,而这里面的函数print需要用到这个库里面的有关print函数声明,所以,在编译器初步处理之后,就相当于变成了这样:

void print(const char* s);
int main()

{
	print("hello\n");
	return 0;
}

这里刚开始我有疑问,这里只有函数的声明,没有函数的具体定义啊;那是由于有我还有另外一个文件:(按照这三张图片打代码可以得出结果,学编程就是要多打代码)

也就是说,为了实现这段代码,我用了三个文件:|main.c |   paint.c    | print.h  | ,所以在编译器处理之后就差不多变成了这样:

但是这不是我们平时打的代码,我只是说是编译器会把它转化成这样便于他进一步理解,但这也是它理解的一小步; 

其实对于我刚刚那样我还有些小疑问的,为什么不可以直接去掉那个声明,因为这个函数的定义本来就在主函数的前面,那时我已经试过了,是错的,我当时是这样写的:

(当然,把所有这些都写在一个文件里面就不会有这么多问题出现,这里只是在学习c语言的多文件处理) 

这是为什么呢?其实根据上面处理预指令的方法,可以想象上面的的代码被编译器初步转化成这样:

可以看见在编译器将这些文件链接之后 有两个print函数的重复定义,这时候还有一个问题就是当编译器将几个文件链接的时候,一般都是把需要的函数定义或声明放过来,一般位置没有什么要求,放进来就行(学完下一个改改);

解决:让编译器正确识别标识符
//可以换成函数声明,也就是我最开始放三个图片里的
把声明包含在在一个文件里,不要被编译后缀名叫.h;也就是上面的三张图片的那个就是改进后的

然后再思考一下还有一个问题,就是如果不引用那个print.c的头文件是不是就不会发生这样的事了;

试试呗:

 由于刚写完前面就不小心把刚刚代码删了,然后又懒了,所以就只想搞一个凑数了,但是效果是一样的,我把代码搞成这样,然后运行,显示未定义标识符,这是怎么回事,后来我总结为:只有当引用的文件里面有声明的时候,才会有需求,这是才会把另外文件的有关函数读取,

对了,之前有点好奇还了解了一下关于这个文件命名的事,我发现文件其实可以用中文命名,还有那个定义函数和和它有关的头文件也可以不是相关的名字,可以随便命,(但是后面的后缀别乱改,还有我说的随便只是在创建文件的时候,如果已经创建完了,还想再修改会很麻烦的,反正我现在都还没弄明白,)之所以一样是为了便于找到和理解;(我发现命名变量和函数也是最好按照好理解的命名,不要想着偷懒去命名a,b,c这种,代码短一点还好说,写项目的时候几百行代码的来,真的很容易混,那时候编译器有时候又不会报错,到时候就因为这么一个小错误去一段一段重新检查真的太不值得了,所以养成好习惯);

然后就来点不一样的:

来搞一个人员输入和打印函数:

(之所以选择不用代码段,只是想显示上面的代码文件不同)

 

 这里的三个代码是正确的,但是在这个代码这里会发现一点不一样的,为什么这个结构体定义的时候可以重复定义在不一样的文件里面还没有报错,反正我了解的理由是里面的注释:也就是这个结构体定义作用域在函数之外,所以可以;

但是这里我是这么理解,就像上面的编译器运行分析,这里大致可以理解了,之所以要定义两个一样的结构体是我们一般没有用预指令调用的文件,编译器都是按照主函数在的文件的需求来按需调用函数的,结构体定义不可以放进去,也就是说,如果我没有在那个引用的头文件里面用那个结构体定义的话,就会报错,而在那个人员表的文件的话如果没有结构体定义里面函数就相当于用了没定义的类型,那个结构体定义只服务于那个文件,并不能被连接到主函数。(看起来很麻烦,后面可以记一下那个模板,就显得简单了)

今天的知识量有点大,下面还有一点关于这个重复定义代码的改进和文件守卫过几天再来总结QAQ~~;

哔~温馨提示,这些知识点都是基于知道如何使用vs和创建有关文件,反正我是先学完这些来的:)

今天又快要结束了哦,你学了什么呢?

“夏天好像总是热烈和明亮 。天空晴朗 ,月亮皎洁 。所以请你也要万事顺意。 在这个盛夏奔赴更好的地方 ”

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

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

相关文章

Typora (windows/MacOs版) 你未曾见过的Markdown编辑器

简介 Typora的设计理念非常人性化&#xff0c;与传统编辑器相比&#xff0c;更注重用户的视觉效果和阅读体验。它的编辑界面非常简洁&#xff0c;用户可以就近编辑&#xff0c;随时查看效果&#xff0c;避免频繁地转换预览模式&#xff0c;提高了工作效率和灵活性。 此外&…

d2l解码编码器与seq2seq

seq2seq难死了&#xff0c;卡了好久&#xff0c;好不容易有些头绪了。。。 目录 1.编码器与解码器 1.1原理 1.2实现 2.seq2seq 2.1构造编码器 2.2构造解码器 repeat与cat探索 总结nn.rnn\GRU\LSTM输入输出 看一下解码器的输出 2.3损失计算 2.4训练 2.5预测 2.6预…

【C++】多态---上( 概念、条件及性质)

来前言&#xff1a; 我们之前提到过&#xff0c;C是一门面向对象的语言&#xff0c;它有三大特性——封装、继承、多态。 封装和继承我们已经详细学习过了&#xff0c;本章将进入多态的学习。 目录 &#xff08;一&#xff09;多态的概念 &#xff08;二&#xff09;多态的定…

Vector - CAPL - Panel面板_02

Button 功能&#xff1a;触发指定的操作 说明&#xff1a;Button 是一个控件&#xff0c;使用它可以触发指定的操作。 适用场景&#xff1a; 1、按下启动按钮会使电机启动。 2、启动锁定开关时&#xff0c;所有车门都会自动锁定。 3、启动TestModule测试模块、回放模块等 设…

单机部署MongoDB

文章目录 一、Windows 环境1.1 安装1.2 启动和连接1.3 Compass 图形化客户端 二、Linux 环境2.1 安装2.2 启动和连接 提示&#xff1a;以下是本篇文章正文内容&#xff0c;MongoDB 系列学习将会持续更新 一、Windows 环境 1.1 安装 ①下载安装包&#xff0c;官方下载地址&am…

OldWang带你了解MySQL(七)

文章目录&#x1f525;多表查询&#x1f525;SQL92标准中的查询&#x1f525;非等值连接&#x1f525;自连接&#x1f525;SQL99标准中的查询&#x1f525;SQL99中的自然连接(NATURAL JOIN)&#x1f525;SQL99中的内连接(INNER JOIN)&#x1f525;外连接查询(OUTER JOIN)&#…

行业那么多,为什么计算机领域这么火?

行业那么多&#xff0c;为什么计算机领域这么火&#xff1f;计算机领域火已经不是一天两天了&#xff0c;从开始的进入互联网时代、到“互联网”、再到大数据、人工智能时代、数字化经济……计算机技术从行业内部的自我发展逐渐渗透到各行各业&#xff0c;甚至成为社会整体经济…

NLP深度网络中self.embedding(x)词嵌入后降维方法

在自然语言处理中的循环神经网络中&#xff0c;经常使用torch定义类&#xff0c;self.embedding(x&#xff09;中&#xff0c;x是输入&#xff0c;介绍self.embedding(x&#xff09;返回结果&#xff0c;以及结果的形状&#xff0c;并解释这个形状 在自然语言处理中的循环神经网…

P4158 [SCOI2009]粉刷匠(分组背包问题+前缀和优化)

[TOC](P4158 [SCOI2009]粉刷匠(分组背包问题)) 一、问题 [SCOI2009]粉刷匠 题目描述 windy有 N 条木板需要被粉刷。 每条木板被分为 M 个格子。 每个格子要被刷成红色或蓝色。 windy每次粉刷&#xff0c;只能选择一条木板上一段连续的格子&#xff0c;然后涂上一种颜色。 …

Spring Cloud Gateway: 网关

文章目录 网关Hello world路由: Route谓词: Predicate过滤器: FilterGateway实现限流: RequestRateLimiter过滤器使用Gateway实现服务降级 自定义全局过滤器GateWay中执行流程 网关 API网关就是实现了前端项目和服务端项目之间的统一入口 Nginx实现的是用户和前端项目之间调用…

【Linux】环境变量相关笔记

文章目录 echo $PATHexport和环境变量相关的命令main(int argc,char* argv[],char *env[])三个参数介绍getenv()通过系统调用获取su与su - 的区别&#xff1a;exportsource 和 .优先级 echo $PATH 是用来查环境变量的 export 从下面的图片当中可以看到&#xff0c;的确是将文…

ubuntu 20.04设置开机自启动脚本

1 建立开机启动服务 在 路径下 /lib/systemd/system/rc-local.service 的 rc-local.service 的脚本&#xff0c;内容规定了 rc.local 的启动顺序和行为 这行代码规定了这个service在开机启动时所执行的命令是&#xff1a;/etc/rc.local start。即运行 /etc/rc.local 脚本。不过…

《面试1v1》HashMap

没有人比中国人更懂 HashMap 我是 javapub&#xff0c;一名 Markdown 程序员从&#x1f468;‍&#x1f4bb;&#xff0c;八股文种子选手。 面试官&#xff1a;HashMap 是Java程序员用得最频繁的集合之一,可以给我简单介绍一下它的内部实现机制吗? 候选人&#xff1a; Hash…

C++ -3- 类和对象 (中) | 拷贝构造函数 赋值运算符重载

文章目录 4.拷贝构造函数什么是拷贝构造函数&#xff1f;应用——示例&#xff1a;日期计算器什么情况下需要自己实现拷贝构造函数&#xff1f; 5.赋值运算符重载运算符重载&#xff08;重要&#xff09;赋值运算符重载 拷贝构造函数和赋值重载函数 4.拷贝构造函数 什么是拷贝…

Baumer工业相机堡盟工业相机如何联合BGAPI SDK和OpenCV实现Mono12和Mono16格式位深度的图像保存(C++)

Baumer工业相机堡盟工业相机如何联合BGAPI SDK和OpenCV实现Mono12和Mono16位深度的图像保存&#xff08;C&#xff09; Baumer工业相机Baumer工业相机保存位深度12/16位图像的技术背景代码案例分享1&#xff1a;引用合适的类文件2&#xff1a;BGAPI SDK在图像回调中联合OpenCV保…

Effective C++条款条款42:了解typename的双重意义(Understand the two meanings of typename)

Effective C条款条款42&#xff1a;了解typename的双重意义&#xff08;Understand the two meanings of typename&#xff09; 条款42&#xff1a;了解typename的双重意义1、从属名称和非从属名称2、typename在traits机制中的运用3、牢记 总结 《Effective C》是一本轻薄短小的…

1.17 从0开始学习Unity游戏开发--场景切换

前面的所有文章我们都在一个固定的游戏场景内进行开发&#xff0c;在最开始介绍场景这个概念的时候就已经提及&#xff0c;这个场景可以是一张地图&#xff0c;或者是一个对战房间等等&#xff0c;所以显然这个场景可以有多个&#xff0c;并且可以从一个场景切换到另外一个场景…

Collection接口

文章目录 1. Java集合框架概述2. Collection接口中15个方法的使用3. Iterator(迭代器)接口4. Connection子接口一&#xff1a;List4.1 List的实现类4.2 源码分析4.2.1 ArrayList源码分析4.2.2 LinkedList源码分析4.2.3 Vector源码分析 4.3 List接口中的常用方法 5. Collection子…

死锁---银行家算法例题

1、知识点 1.银行家算法使用的四个必要的数据结构是: 可用资源向量Available&#xff0c;最大需求矩阵Max&#xff0c;分配矩阵Allocation&#xff0c;需求矩阵Need。 2.银行家算法是不是破坏了产生死锁的必要条件来达到避免死锁的目的&#xff1f;若是&#xff0c;请简述破…

【数字 IC / FPGA】 有关建立/保持时间计算的思考

引言 最近准备一些数字IC的机试&#xff0c;刷到了一些有关静态时序分析的题目。有一些比较经典的题目&#xff0c;在这里整理分享一下。 有什么疑问可以在评论区交流~互相进步 双D触发器典型电路 假设时钟周期为Tcycle,Tsetup,Thold分别为触发器建立保持时间&#xff0c;为…