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

嵌入式开发学习———Linux环境下C语言学习(十二)

宏定义的基本概念

宏定义(Macro)是C语言预处理指令之一,通过#define实现,用于在编译前将标识符替换为指定的文本。宏分为两种:无参宏(简单替换)和带参宏(宏函数)。

无参宏:减少重复常量

通过宏替换固定值,避免硬编码,提升代码可维护性。

#define PI 3.1415926  
#define MAX_SIZE 100  

编译时,代码中所有PI会被替换为3.1415926MAX_SIZE替换为100

带参宏(宏函数):简化短小函数

宏函数通过参数实现类似函数的功能,但无函数调用开销,适合简单操作。

#define SQUARE(x) ((x) * (x))  
#define MAX(a, b) ((a) > (b) ? (a) : (b))  

使用时直接展开:

int num = SQUARE(5);    // 展开为 ((5) * (5))  
int m = MAX(3, 4);      // 展开为 ((3) > (4) ? (3) : (4))  
注意事项
  1. 括号必要性:宏参数需用括号包裹,避免运算符优先级问题。
    #define WRONG_SQ(x) x * x      // SQUARE(1+2) → 1+2*1+2 = 5(错误)  
    #define CORRECT_SQ(x) ((x)*(x)) // 展开为 ((1+2)*(1+2)) = 9  
    
  2. 避免副作用:参数避免含自增/自减操作,可能多次求值。
    #define AVOID(a, b) ((a) + (b))  
    int x = 1;  
    AVOID(x++, 2); // 展开为 ((x++) + (2)),x可能递增两次  
    
  3. 多语句宏:用do { ... } while(0)包裹,确保语法完整。
    #define LOG(msg) do { printf("[LOG] %s\n", msg); } while(0)  
    
适用场景
  • 替换频繁使用的常量或简单表达式。
  • 轻量级操作(如取绝对值、比较大小),替代短小函数。
  • 条件编译结合#ifdef实现跨平台代码。

typedef 的基本概念

typedef 是 C 语言中的关键字,用于为现有数据类型定义一个新的名称(别名)。它的主要作用是简化复杂类型的声明,提高代码的可读性和可维护性。

语法格式:

typedef existing_type new_name;
常见用法

为基本类型定义别名

typedef unsigned int uint;
uint a = 10;  // 等价于 unsigned int a = 10;

为结构体定义别名

typedef struct {int x;int y;
} Point;
Point p1 = {1, 2};  // 直接使用别名,无需写 struct 关键字

为指针类型定义别名

typedef char* String;
String str = "Hello";  // 等价于 char* str = "Hello";

为函数指针定义别名

typedef int (*FuncPtr)(int, int);
FuncPtr add = NULL;  // 声明一个函数指针变量
优势
  • 简化复杂类型的声明(如函数指针、嵌套结构体)。
  • 提高代码可读性,使类型名称更具语义化。
  • 便于代码移植,修改类型时只需调整 typedef 定义。
注意事项
  • typedef 仅创建别名,不生成新类型。
  • 别名作用域遵循变量作用域规则(全局或局部)。
  • 避免过度使用,以免降低代码清晰度。

make和makefile的基本概念

make是Linux系统下的自动化构建工具,通过读取makefile文件来执行编译、链接等任务。makefile定义了项目中文件之间的依赖关系及生成规则。

makefile的基本结构

一个简单的makefile通常包含目标、依赖和命令三部分:

target: dependenciescommand

target是生成的目标文件,dependencies是依赖文件,command是生成目标的命令。

make的使用

在包含makefile的目录下,直接运行make命令即可执行默认目标。如需指定目标,可使用:

make target_name
makefile的优势
  • 自动化构建过程,减少重复命令输入
  • 只重新编译修改过的文件,提高效率
  • 清晰展现项目结构和依赖关系
常用变量

makefile支持变量定义,增加可维护性:

CC = gcc
CFLAGS = -Wall
hello: hello.c$(CC) $(CFLAGS) -o hello hello.c
伪目标

用于定义非文件生成目标,如clean:

.PHONY: clean
clean:rm -f hello

http://www.dtcms.com/a/291090.html

相关文章:

  • 【Tools】Ubuntu24.04安装详细教程
  • mobaxteam x11传输界面避坑
  • SAP 邮箱配置
  • C语言运算符优先级“潜规则”
  • 原型与原型链
  • 二维码扫描登录流程详解
  • 【Elasticsearch】settings
  • 解密分账系统:企业资金管理的智能中枢
  • Linux的相关指令
  • 京东商品评论如何获取?API接口实战指南
  • Kali MSF渗透Windows 11电脑
  • Linux_gdb调试器--进程概念
  • Linux初识网络
  • MySQL 核心知识点梳理(3)
  • buntu 22.04 上离线安装Docker 25.0.5(二)
  • 如何升级到macOS Tahoe:全面指南与实用步骤
  • LeetCode 每日一题 2025/7/14-2025/7/20
  • Mysql(存储过程)
  • 图像编辑开源数据项目
  • 了解 ReAct 框架:语言模型中推理与行动的协同
  • 疯狂星期四文案网第14天运营日记
  • DBSCAN聚类算法
  • OpenAI API(1)补全Responses(Chat Completions)API和记忆Assistants API对比分析
  • 牛客周赛 Round 101(题解的token计算, 76修地铁 ,76选数,76构造,qcjj寄快递,幂中幂plus)
  • 使用pymongo进行MongoDB的回收
  • JAVA高级第七章输入和输出处理(二)
  • 前缀和题目:元素和小于等于阈值的正方形的最大边长
  • PostgreSQL高可用架构Repmgr部署流程
  • 按需搭建web网站
  • 【2025】Vscode Python venv虚拟环境显示“激活终端”成功但是在终端中“并没有激活成功”,pip安装还是会安装到全局环境中的解决方法;