C语言#define定义宏的使用详解

 更新时间:2022年10月28日 09:36:42   作者:小小涵儿  
#define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义宏(define macro)。本文就来和大家聊聊宏的使用,需要的可以参考一下

1.宏是什么

#define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义宏(define macro)。

语法:

#define name( parament-list ) stuff

parament-list:是一个由逗号隔开的符号表。

2.宏的用法

#define SUM(x,y) ((x)+(y))
int main()
{
    int a = 10;
    int b = 20;
    int ret = SUM(a, b);
    printf("%d\n", ret);
    return 0;
}

简要说明:宏已经被替换

分位三个阶段:预编译、编译、汇编

3. 宏的注意事项

定义什么替换什么

来看这一例:

#define NUM(x,y) x+y
int main()
{
    int a = 2;
    int b = 3;
    printf("%d\n", NUM(a, b) * NUM(a, b));
    //结果:11
    return 0;
}

原因:num(a,b)*num(a,b) = a + b * a + b=11

4. 宏和函数的区别

属性#define定义宏函数
代码长度如果多次调用,多次替换,如果是大长度宏其长度很长函数只实现一次可以多次使用,如果多次调用,长度只有一份
执行速度更快函数调用和开辟都会有额外开销
操作符优先级必须每个参数加上括号,否则操作符优先级可能会产生不可预料的后果函数参数只在函数调用的时候求值一次,它的结果值传递给函数。表达式的求值结果更容易预测
带有副作用参数多次调用宏会有不可预料的后果函数参数只在传参的时候求值一次,结果更容易控制,只需关注是传值还是传址
参数类型宏的参数和类型无关,可以使用与任何参数类型函数参数与类型有关,类型取决于使用目的,传值,传址,还是拿一个字节数据char*
调试不方便调试,编译期间就已经替换可调试
递归不可递归可递归

宏带副作用参数:

#define MAX(a, b) ( (a) > (b) ? (a) : (b) )
int main()
{
    int x = 5;
    int y = 8;
    int z = MAX(x++, y++);
    printf("x=%d y=%d z=%d\n", x, y, z);//输出的结果是什么
    return 0;
}
//( (x++) > (y++) ? (x++):(y++) )
//输出结果:x=6,y=10,z=9

5.命名要求

宏名必须大写

函数不要全部大写

6. 条件编译

常见条件编译指令及应用场景

1.单分支

编译指令:

#if 常量表达式
​ //…
#endif

应用场景:

int main()
{
#if 4>2
    printf("hello world!\n");
#endif
    return 0;
}
//输出hello world

2.多分支

编译指令:

#if 常量表达式
​ //…
#elif 常量表达式
​ //…
#else
​ //…
#endif

应用场景:

int main()
{
#if 1>2
    printf("xixi\n");
#elif 4>3
    printf("haha\n");
#else 
    printf("heihei\n");
#endif
    return 0;
}
//输出结果:haha

可不能和if else选择语句混淆,多分支条件编译从上往下走,如果有一个分支成立,后面分支就不再执行;但是选择语句是从上往下走,有一个分支成立,继续查看后面分支是否成立

3.判断是否被定义

编译指令:

1. > #if defined(symbol) 或 #ifdef symbol

2. > #if !defined(symbol) 或 #ifndef symbol

应用场景:

  ```c
  
  #define DEF    
  int main()
  {
  #if defined(DEF)
      printf("haha\n");
  #endif
  
  #ifdef MAX
      printf("heihei\n");
  #endif
      return 0;
  }
  //输出结果:haha
  ```

4.嵌套指令

编译指令

#if 常量表达式
#ifdef symbol
//操作
#endif
#elif 常量表达式
#ifdef symbol
//操作
#endif
#endif

条件编译指令也支持嵌套,注意#endif结束本次嵌套

5.删除宏定义

编译指令:

#undef

应用场景:

#define DEF
int main()
{
#undef DEF//删除DEF宏定义了
#ifdef DEF
    printf("hehe\n");
#endif
    return 0;
} 

以上就是C语言#define定义宏的使用详解的详细内容,更多关于C语言#define定义宏的资料请关注脚本之家其它相关文章!

相关文章

  • C语言实现牛顿迭代法解方程详解

    C语言实现牛顿迭代法解方程详解

    这篇文章主要介绍了C语言实现牛顿迭代法解方程详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • OpenCV实现透视变换矫正

    OpenCV实现透视变换矫正

    这篇文章主要为大家详细介绍了OpenCV实现透视变换矫正,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • C++知识点之成员函数中const的用法

    C++知识点之成员函数中const的用法

    这篇文章主要介绍了C++知识点之成员函数中const的用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C语言怎样用指针指向字符串

    C语言怎样用指针指向字符串

    这篇文章主要介绍了C语言怎样用指针指向字符串问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • C++11获取线程返回值的实现代码

    C++11获取线程返回值的实现代码

    这篇文章主要介绍了C++11获取线程返回值的实现代码,需要的朋友可以参考下
    2019-04-04
  • C++模拟Linux Shell编写一个自定义命令

    C++模拟Linux Shell编写一个自定义命令

    这篇文章主要介绍了C++如何模拟Linux Shell实现编写一个自定义命令,本文通过实例代码进行命令行解析,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • C++ ReSharper2021激活码永久有效

    C++ ReSharper2021激活码永久有效

    ReSharperC++是为c/c++开发者打造的一款实用Visual Studio扩展插件,这款插件旨在提升开发者的效率,今天给大家分享这款软件的激活方法,需要C++ ReSharper2021激活码的朋友参考下本文
    2021-06-06
  • C语言关键字const和指针的结合使用

    C语言关键字const和指针的结合使用

    这篇文章主要介绍了C语言关键字const和指针的结合,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • C++ OpenCV制作哈哈镜图像效果

    C++ OpenCV制作哈哈镜图像效果

    这篇文章主要介绍了使用OpenCV C++ 制作哈哈镜图像特效。其原理就是让图像像素扭曲,将像素重新进行映射。感兴趣的可以跟随小编一起试一试
    2022-01-01
  • C++实现简单BP神经网络

    C++实现简单BP神经网络

    这篇文章主要为大家详细介绍了C++实现简单BP神经网络,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05

最新评论