C语言宏使用

简介: C语言宏使用

C语言宏

编译一个C语言程序的第一步骤就是预处理阶段,这一阶段就是宏发挥作用的阶段,编译完之后宏对二进制代码不可见。

使用
1. 宏常量
#define PI 3.14
2. 宏语句
#define Print printf("hello,world!\r\n")
3. 宏函数

使用宏来定义函数,宏可以带参数

#define Print(str) printf("%s",str)
4. 相关作用符
  • 换行符\
    多行语句时,可以在末尾添加\代表换行
#define Print printf("第一行"); \
        printf("第二行")
  • 字符串化符#
    #是字符串化的意思,将出现在宏定义中的#后面的参数转换为一个字符串
#define Print(str) printf(#str"的值是%d",str)
  • 片段连接符##
    ##是分隔连接方式,作用是先分隔,然后进行强制连接。在普通的宏定义中,预处理器一般把空格解释为分段标志,对于每一段和前面比较,相同的就进行替换,会导致替换段之间存在一些空格,可以使用##替换空格分隔符
#define add(n,value) num##n += vlaue
// add(2,10); 等价于num2 += 10, 将num和2连接成了num2
技巧
  • 类型传递
    宏函数可以传递参数类型
#define Malloc(type,size) (type *) malloc(sizeof(type) * size)
int *p = Malloc(int,100);
  • 传递数组
    使用数组作为函数参数传递时,无法通过sizeof()获取其数组的大小,通常需要传递数组的大小信息。
    使用宏可以不传递大小
#define InsertSort(list) \
{                  \
  int size = sizeof(list)/4;   \
  // ...                       \
}
InsertSort(num);
使用场景

调试过程使用

#include <stdio.h>
#define DEBUG 1
#ifdef DEBUG 
#define PRINT(fmt,value)  \
    printf("[FILE: %s][FUNC:%s][LINE:%d]-->" #value "=" fmt "\r\n",  \
    __FILE__,__FUNCTION__,__LINE__,value        \
)
#else
#define PRINT(fmt,value)
#endif
int main(){
  int c = 1;
  int d = 2;
  PRINT("%d",c);
  PRINT("%d",d);
  
  return 0;
}

相关文章
|
6月前
|
C语言
【C语言】库宏offsetof(结构体成员偏移量计算宏)
【C语言】库宏offsetof(结构体成员偏移量计算宏)
50 0
|
6月前
|
程序员 C语言 UED
详解C语言assert宏
详解C语言assert宏
73 0
|
6月前
|
存储 编译器 Linux
【C语言】自定义类型:结构体深入解析(二)结构体内存对齐&&宏offsetof计算偏移量&&结构体传参
【C语言】自定义类型:结构体深入解析(二)结构体内存对齐&&宏offsetof计算偏移量&&结构体传参
|
3月前
|
编译器 程序员 C语言
C语言 宏
C语言 宏
40 5
|
6月前
|
编译器 C语言
C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)
C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)
|
4月前
|
Linux C语言
C语言宏IS_REACHABLE
C语言宏IS_REACHABLE
40 1
|
6月前
|
安全 编译器 程序员
C语言(16)----预处理中的宏以及预处理指令
C语言(16)----预处理中的宏以及预处理指令
56 2
|
5月前
|
安全 编译器 C语言
【C语言进阶篇】offsetof宏的介绍 及其实现
【C语言进阶篇】offsetof宏的介绍 及其实现
|
5月前
|
编译器 程序员 C语言
【C语言进阶篇】assert宏 使用详解
【C语言进阶篇】assert宏 使用详解
|
6月前
|
C语言
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)(下)
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)
41 0