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;
}

相关文章
|
8月前
|
C语言
【C语言】库宏offsetof(结构体成员偏移量计算宏)
【C语言】库宏offsetof(结构体成员偏移量计算宏)
71 0
|
8月前
|
程序员 C语言 UED
详解C语言assert宏
详解C语言assert宏
88 0
|
8月前
|
存储 编译器 Linux
【C语言】自定义类型:结构体深入解析(二)结构体内存对齐&&宏offsetof计算偏移量&&结构体传参
【C语言】自定义类型:结构体深入解析(二)结构体内存对齐&&宏offsetof计算偏移量&&结构体传参
103 6
|
1月前
|
C语言
【C语言】全局搜索变量却找不到定义?原来是因为宏!
使用条件编译和 `extern` 来管理全局变量的定义和声明是一种有效的技术,但应谨慎使用。在可能的情况下,应该优先考虑使用局部变量、函数参数和返回值、静态变量或者更高级的封装技术(如结构体和类)来减少全局变量的使用。
45 5
|
5月前
|
编译器 程序员 C语言
C语言 宏
C语言 宏
52 5
|
8月前
|
编译器 C语言
C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)
C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)
|
6月前
|
Linux C语言
C语言宏IS_REACHABLE
C语言宏IS_REACHABLE
55 1
|
8月前
|
安全 编译器 程序员
C语言(16)----预处理中的宏以及预处理指令
C语言(16)----预处理中的宏以及预处理指令
75 2
|
7月前
|
安全 编译器 C语言
【C语言进阶篇】offsetof宏的介绍 及其实现
【C语言进阶篇】offsetof宏的介绍 及其实现
|
7月前
|
编译器 程序员 C语言
【C语言进阶篇】assert宏 使用详解
【C语言进阶篇】assert宏 使用详解

热门文章

最新文章