C 语言中函数的”缺陷”

实参和形参之间仅仅是值传递,因此,函数中无法直接改变实参。

函数”缺陷“的补充

  • 宏是 C 语言中代码复用的补充方式
  • 宏定义语法:#define MACRO(param) code_segment
  • 宏使用语法:MARCRO(num);
1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
#include<string.h>

#define sum(a, b) a += b

int main() {
int a, b;
a = 5;
b = 6;
sum(a, b);
printf("a = %d, b = %d\n", a, b); // a = 11, b = 6

}

宏可以直接改变传入的参数的值;

宏与函数的不同

  • 宏不是函数,使用宏没有函数调用的过程(没有函数的跳转、函数体的执行、函数的返回)
  • 函数调用先传递参数值,然后跳转指定函数体,最后返回
  • 使用宏只是单纯”单纯复制粘贴“(也可以叫宏展开),然后替换参数
  • 同一个宏,无论调用多少次,都执行相同的函数体代码
  • 同一个宏,每次使用都会”复制粘贴“相同的代码

编译器组成简介

  1. 预处理模块:处理所有宏以及 # 开头的语句(复制粘贴替换)
  2. 编译模块:将 C 程序翻译成二进制程序
  3. 链接模块:将二进制程序组合成可执行程序

宏常量

#define NAME Value

  • 预处理模块将代码中出现的 NAME 标识符替换为 Value
  • 宏常量的本质就是字面量