嵌入式开发学习———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: dependencies
    command

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值