【c++解决宏】

本文讨论了宏的优缺点,提出用const和enum替代宏,介绍了内联函数的使用及其注意事项,重点讲解了auto关键字的应用场景和限制,以及范围for的使用条件,最后提到nullptr在表示空指针方面的优点。
摘要由CSDN通过智能技术生成

一. 宏的优缺点

  1. 不是函数,#define定义不加分号,只是预处理进行简单的替换。优先级问题,套括号。
  • 优点:增强代码的复用性。
  • 提高效率
  • 缺点:没有类型安全检查,不能调试宏,而且代码的可读性非常差,可维护性差,容易误用。

二. c++解决宏的办法

  1. 对于宏常量来说,不用宏,而是用const,enum。
  2. 短小的函数用内联函数。

三. inline内联函数

  1. inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会
    用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。
  2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建
    议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。
    **总结而言:对于大函数来说:第一种解决办法是函数与声明分离,这样链接是,不会有重定义冲突,只有一份定义。第二种:函数与声明放在一起,这样在函数返回值之前加上static即可,这样函数就会被改变链接属性,只在该文件可用。这样链接时,别的文件就无法链接到他,只有该文件包含的.h文件里面找,不会去别的文件找。第三种:对于小函数来说:就用内联函数,也是声明与定义放在一起的,因为内联不用函数地址,所以定义与声明放在一起。对于缺省函数,声明与定义只有一份,且声明与定义同时存在时,放声明,不存在时放定义。

auto关键字

  1. 使用场景:类型难于拼写

  2. 含义不明确导致容易出错

  3. auto与指针和引用结合起来使用
    用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&,所以auto是根据右边推左边的类型。

int main()
{
    int x = 10;
    auto a = &x;
    auto* b = &x;
    auto& c = x;
    cout << typeid(a).name() << endl;
    cout << typeid(b).name() << endl;
    cout << typeid(c).name() << endl;//可以查看该对象或者该变量名的类型。
    *a = 20;
    *b = 30;
     c = 40;
    return 0;
  1. 在同一行定义多个变量
    当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。
void TestAuto()
{
    auto a = 1, b = 2; 
    auto c = 3, d = 4.0;  // 该行代码会编译失败,因为c和d的初始化表达式类型不同}

**注意:auto不能使用的场景,不能声明数组,也不能作为函数的参数。

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

常用场景:1.范围for 2. lambda表达式。

void TestFor()
{
int array[] = { 1, 2, 3, 4, 5 };
for(auto& e : array)
     e *= 2;//返回array[i]变量的别名,能修改变量
for(auto e : array)//返回变量的临时拷贝,只能拿值,因为临时变量具有常性,const修饰的
     cout << e << " ";
return 0;
}

范围for的使用条件

  1. for循环迭代的范围必须是确定的
    对于数组而言,就是数组中第一个元素和最后一个元素的范围;而且:右边只能是数组,比如int array【】形参这个array不能使用范围for,因为是指针。
  2. 迭代的对象要实现++和==的操作。

nullptr空指针

  1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。
  2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。
  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

维生素C++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值