当前位置:   article > 正文

c语言中的宏函数及c++的内联函数及auto及NULL

c语言中的宏函数及c++的内联函数及auto及NULL

 c++的内联函数

使用内联函数可以减少函数栈帧的开销。

  1. Swap(a, b);
  2. 00A516C8 mov eax,dword ptr [a]
  3. 00A516CB mov dword ptr [ebp-20h],eax
  4. 00A516CE mov ecx,dword ptr [b]
  5. 00A516D1 mov dword ptr [a],ecx
  6. 00A516D4 mov edx,dword ptr [ebp-20h]
  7. 00A516D7 mov dword ptr [b],edx

 内联函数会在调用它的地方展开。(展开及不会call 函数名)

  1. inline void Swap(int& x, int& y)
  2. {
  3. int tmp = x;
  4. x = y;
  5. y = tmp;
  6. }
  7. int main()
  8. {
  9. int a = 1, b = 2;
  10. Swap(a, b);
  11. cout << a << b << endl;
  12. return 0;
  13. }

特性

1. inline是一种以空间换时间的做法,省去调用函数额开销。所以代码很长或者有循环/递归的函数不适宜 使用作为内联函数。

2. inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等 等,编译器优化时会忽略掉内联。

3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会 找不到。

vs2022查看反汇编代码

在 Visual Studio 中查看反汇编代码_vs2022反汇编-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_27843785/article/details/107189963内联函数如果超过30行左右编译器会自动去除内联。

C++有哪些技术替代宏?

1. 常量定义 换用const

2. 函数定义 换用内联函数

 auto不能推导的场景

1. auto不能作为函数的参数

  1. // 此处代码编译失败,auto不能作为形参类型,因为编译器无法对a的实际类型进行推导
  2. void TestAuto(auto a)
  3. {}

2.auto不能直接用来声明数组

  1. void TestAuto()
  2. {
  3. int a[] = {1,2,3};
  4. auto b[] = {456};
  5. }

使用范围for 的前提:数组         数组的指针不行(void TestFor(int array[]) )

  1. void TestFor()
  2. {
  3. int array[] = { 1, 2, 3, 4, 5 };
  4. for(auto& e : array)
  5. e *= 2;
  6. for(auto e : array)
  7. cout << e << " ";
  8. return 0;
  9. }

NULL

NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:

  1. #ifndef NULL
  2. #ifdef __cplusplus
  3. #define NULL 0
  4. #else
  5. #define NULL ((void *)0)
  6. #endif
  7. #endif

 c语言中的宏函数

gcc -E test.c -o test.i
  1. #include<stdio.h>
  2. #define MAX(x,y) ((x)>(y)?(x):(y))
  3. int main()
  4. {
  5. int a=1,b=2;
  6. int m=MAX(a,b);
  7. printf("MAX: %d\n",m);
  8. return 0;
  9. }

预处理后:

  1. int main()
  2. {
  3. int a=1,b=2;
  4. int m=((a)>(b)?(a):(b));
  5. printf("MAX: %d\n",m);
  6. return 0;
  7. }

gcc: fatal error: no input files compilation terminated.

 【Linux】11. 常见操作错误的解决办法_gcc: fatal error: no input files-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/WL0616/article/details/121225484

Makefile:2: *** missing separator.  Stop. 

  1. test:test.c
  2. gcc -o $@ $^
  3. .PHONY:clean
  4. clean:
  5. rm -f test

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号