当前位置: 首页 > news >正文

C/C++基础

C/C++基础

  • gcc
    • 编译与链接
    • 多文件编译
    • 头文件/库文件
      • 头文件
      • '#'-预处理
        • '#'-文件包含
        • '#'-宏定义
        • '#' -条件编译
          • ifdef
          • ifndef/define/endif
          • if/ifdef/ifndef
      • 库文件
        • 区别

gcc

编译与链接

编译:通过编译器,识别源文件中的语句,将其转换成计算机能够识别的二进制形式

编译后,生成的是目标文件,不是最终的可执行文件
目标文件(中间文件),是二进制形式(.o.obj
编译只能编译单个源文件,多个源文件就需要多次编译

链接:通过链接器,链接生成可执行文件。编译只是对自己编写的源文件进行编译,链接是将源文件的目标文件和标准库、动态链接库等结合起来,组成最终的可执行文件
即,将所有二进制形式的目标文件和系统组件组合成一个可执行文件

嵌入式编译器:CCS (DSP)

多文件编译

gcc test.c test2.c -o main.out
file.out 是可执行文件

头文件/库文件

头文件

头文件包含若干函数
使用外部函数,要引入对应的头文件
通常,头文件只包含函数的说明,即函数怎么用;而函数本身保存在其他文件,在链接时会找到
#include<file_name.h>#include的作用就是将头文件中的文本赋值到当前文件,然后一起被编译器编译
在头文件中,必须:只能包含变量和函数声明,不能包含定义,否则在多次引入时会引起重复定义的错误

‘#’-预处理

#开头的命令为预处理命令
预处理:对源文件进行简单加工的过程
预处理不等于编译,编译之前要先做预处理

预处理包括:宏定义、文件包含、条件编译
#if #elif #endif预处理命令,在编译之前由预处理程序来执行

#include <stdio.h>

// 对不同的平台引入不同的头文件
#if _WIN32 // 识别windows平台,_WIN32是专有宏
#include <windows.h>
#elif __linux__ // 识别linux平台 __linux__是专有宏
#include <unistd.h>
#endif

it main(){
	#if _WIN32
	Sleep(10);
	#elif __linux__
	sleep(5);
	#endif

	// code...
	puts('hello world')
}

‘#’-文件包含

#include文件包含
其实也是预处理命令
就是将头文件的内容插入到该命令所在的位置,从而将头文件、当前源文件连接成一个源文件

#<xxx.h> 在系统路径下查找头文件
# "xxx.h"在当前目录下找头文件,如果没有找到,则从系统路径下查找

‘#’-宏定义

宏定义:用一个标识符来表示一个字符串(这里的字符串指的不是数据类型字符串,而可以是数字、表达式、if语句,函数等),即后面的代码中用该标识符表示字符串
在预处理阶段,对程序中所有出现的宏名,预处理器都会用宏定义中的字符串去代替,即“宏替换”
#undef表示结束作用域
代码中的宏如果被引号包围,则预处理程序不进行宏替换
宏定义仅仅是字符串替换,不会对表达式进行计算

#define N 100;
printf("%d",N);

#define M (n*n+3*n)

带参宏定义

带参宏定义中,不会为形式参数分配内存,因此不必指明数据类型,但是实参变量或返回值必须指明数据类型
带参数宏定义,不是值传递

#define FUNC(x) (x*2) // 注意要加括号
int a;
a=FUNC(10); // a=20

‘#’ -条件编译

条件编译:根据不同情况编译不同代码,产生不同目标文件的机制
条件编译是预处理程序的功能,不是编译器的功能
整型常量表达式:表达式中不能包含变量,且结果必须是整数
目的:允许值编译源程序中满足条件的程序段

#if 整型常量表达式
	...
#elif 整型常量表达式
	...
#else 整型常量表达式
	...
#endif
ifdef

如果当前宏已经被定义过,则对 对应的coding进行编译,否则

#ifdef 宏名
	// coding...
#else
	// coding...
#endif

ifndef/define/endif

https://blog.csdn.net/m0_48990191/article/details/115007141 – 没看完

ifdef相反,如果当前的宏未被定义,则对 对应的coding进行编译

防止头文件被重复引用(一个头文件在同一个c/cpp文件中被include多次 <-- include嵌套),防止被重复编译

被重复引用:有些被重复引用只是增加了编译工作的工作量,只会引起编译效率低下,有些则会引起错误(如在头文件中定义全局变量)

  • #ifndef

条件编译,即预处理功能(宏定义、文件包含、条件编译)中的一种
#ifndef作用

如果.h文件中定义了全局变量,一个c文件包含了.h文件多次,如果不加#ifndef宏定义,会出现变量重复定义的错误

  • #define
  • #endif
#ifndef FILE_H // if not define FILE.h 如果不存在file.h (作用:防止file.h被重复引用)
#define FILE_H // 就引入file.h
... 
#endif //否则不需要引入 
#ifndef FILE_H
#define FILE_H

#include <math.h> // 引入标准库头文件
#include "header.h" // 引入非标准库的头文件

void function(...) //全局函数声明

class C{}; // 类结构声明

#endif
if/ifdef/ifndef
#if 只能是整型常量表达式
#ifdef 只能是一个宏名
#ifndef 只能是一个宏名

库文件

区别

相关文章:

  • Java刷题面试系列习题(五)
  • AprilTags c++识别
  • LeetCode精选200道--二叉树篇(二)
  • 【学习教程】MCM箱模型建模方法及大气O3来源解析实践技术应用
  • IDEA配置
  • 这可能是目前最全的Redis高可用技术解决方案
  • FLASH:一种高效的Transformer设计
  • SpringBoot 和 Vue前后端分离在线工具项目实战,源码+超详细讲解
  • 【前端技术】Vue3 技术学习笔记
  • JS中4种常见的内存泄漏
  • 详解Shiro认证流程
  • 金山办公:订阅为王?
  • 【JavaEE】Spring AOP (面向切面)详解
  • java基于ssm的快递物流管理系统
  • SETTLE约束算法中的坐标变换问题
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • Android 架构优化~MVP 架构改造
  • Android 控件背景颜色处理
  • css的样式优先级
  • HomeBrew常规使用教程
  • JavaScript中的对象个人分享
  • Linux后台研发超实用命令总结
  • node 版本过低
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • python3 使用 asyncio 代替线程
  • spark本地环境的搭建到运行第一个spark程序
  • Vue2.0 实现互斥
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 对象管理器(defineProperty)学习笔记
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 小程序 setData 学问多
  • 源码安装memcached和php memcache扩展
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • #WEB前端(HTML属性)
  • #在 README.md 中生成项目目录结构
  • $(selector).each()和$.each()的区别
  • (1)Android开发优化---------UI优化
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (26)4.7 字符函数和字符串函数
  • (WSI分类)WSI分类文献小综述 2024
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (三)docker:Dockerfile构建容器运行jar包
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (五)网络优化与超参数选择--九五小庞
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • .bat文件调用java类的main方法
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET MVC之AOP
  • .Net 知识杂记
  • .NET开源快速、强大、免费的电子表格组件
  • :O)修改linux硬件时间
  • @DateTimeFormat 和 @JsonFormat 注解详解