快速熟悉C++之常用语法

函数重载(Overload)

规则

函数名相同
参数个数不同、参数类型不同、参数顺序不同

注意

返回值类型与函数重载无关
调用函数时,实参的隐式类型转换可能会产生二义性

本质

采用了name mangling或者叫name decoration技术
C++编译器默认会对符号名(比如函数名)进行改编、修饰,有些地方翻译为“命名倾轧”
重载时会生成多个不同的函数名,不同编译器(MSVC、g++)有不同的生成规则
通过IDA打开【VS_Release_禁止优化】可以看到

原理

C++代码

解析代码

默认参数

规则

C++允许函数设置默认参数,在调用时可以根据情况省略实参。规则如下:
默认参数只能按照右到左的顺序
如果函数同时有声明、实现,默认参数只能放在函数声明中
默认参数的值可以是常量、全局符号(全局变量、函数名)
如果函数的实参经常是同一个值, 可以考虑使用默认参数
函数重载、默认参数可能会产生冲突、二义性(建议优先选择使用默认参数)

原理:

C++代码

汇编代码:

 备注:E8是call的指令,E8后面的一串是根据下一条指令算出来的,具体参见intel的汇编指令白皮书。

extern “C”

规则

extern "C" 修饰的代码会按照C语言的方式去编译

 如果函数同时有声明和实现,要让函数声明被extern "C"修饰,函数实现可以不修饰

 

 有时也会在编写C语言代码中直接使用extern “C” ,这样就可以直接被C++调用

 通过使用宏__cplusplus来区分C、C++环境

#pragma once

我们经常使用 #ifndef #define #endif 来防止头文件的内容被重复包含
#pragma once 可以防止整个文件的内容被重复包含
区别
#ifndef #define #endif 受C\C++标准的支持,不受编译器的任何限制
有些编译器不支持 #pragma once (较老编译器不支持,如GCC 3.4版本之前),兼容性不够好
#ifndef #define #endif 可以针对一个文件中的部分代码,而 #pragma once 只能针对整个文件

 内联函数(inline function)

规则

使用 inline 修饰函数的声明或者实现,可以使其变成内联函数
建议声明和实现都增加 inline 修饰
特点
编译器会将函数调用直接展开为函数体代码
可以减少函数调用的开销
会增大代码体积
注意
尽量不要内联超过10行代码的函数
有些函数即使声明为 inline ,也不一定会被编译器内联,比如递归函数

debubg下不会内联,只有release下优化才会出现内联

VS窥探内联的本质

内联函数与宏

内联函数和宏,都可以减少函数调用的开销
对比宏,内联函数多了语法检测和函数特性
思考以下代码的区别
#define sum (x) (x + x)
inline int sum( int x ) { return x + x ; }
int a = 10; sum(a++);

const

const 是常量的意思,被其修饰的变量不可修改
如果修饰的是类、结构体(的指针),其成员也不可以更改
以下5个指针分别是什么含义?

 int 和const是可以替换的,两者位置互换效果一致!

上面的指针问题可以用以下结论来解决:
const 修饰的是其右边的内容
解释如下:

 demo如下:

引用(Reference)

规则

在C语言中,使用指针(Pointer)可以间接获取、修改某个变量的值
在C++中,使用引用(Reference)可以起到跟指针类似的功能
注意点
引用相当于是变量的别名(基本数据类型、枚举、结构体、类、指针、数组等,都可以有引用)
对引用做计算,就是对引用所指向的变量做计算
在定义的时候就必须初始化,一旦指向了某个变量,就不可以再改变,“从一而终”
可以利用引用初始化另一个引用,相当于某个变量的多个别名
不存在【引用的引用、指向引用的指针、引用数组】
引用存在的价值之一:比指针更安全、函数返回值可以被赋值

引用的本质

引用的本质就是指针,只是编译器削弱了它的功能,所以引用就是弱化了的指针
指令代码一模一样

一个引用占用一个指针的大小

 

常引用(Const Reference)

引用可以被 const 修饰,这样就无法通过引用修改数据了,可以称为常引用
const 必须写在&符号的左边,才能算是常引用
const 引用的特点
可以指向临时数据(常量、表达式、函数返回值等)
可以指向不同类型的数据
作为函数参数时( 此规则也适用于 const 指针
可以接受 const 和非 const 实参(非 const 引用,只能接受非 const 实参)
可以跟非 const 引用构成重载
当常引用指向了不同类型的数据时,会产生临时变量,即引用指向的并不是初始化时的那个变量

数组的引用

常见的2种写法

汇编语言

AT&T汇编 vs Intel汇编

x64汇编 – 寄存器

 

一般的规律
R开头的寄存器是64bit的,占8字节
E开头的寄存器是32bit的,占4字节

x64汇编 – 寄存器

x64汇编要点总结

mov dest, src
将src的内容赋值给dest,类似于dest = src
[ 地址值 ]
中括号[ ]里面放的都是内存地址
word 2 字节, dword 4 字节(double word), qword 8 字节(quad word)
call 函数地址
调用函数
lea dest, [ 地址值 ]
将地址值赋值给dest,类似于dest = 地址值
ret
函数返回
xor op1, op2
将op1和op2异或的结果赋值给op1,类似于op1 = op1 ^ op2
add op1, op2
类似于op1 = op1 + op2
sub op1, op2
类似于op1 = op1 - op2
inc op
自增,类似于op = op + 1
dec op
自减,类似于op = op – 1
jmp 内存地址
跳转到某个内存地址去执行代码
j开头的一般都是跳转,大多数是带条件的跳转,一般跟test、cmp等指令配合使用
权威参考:Intel白皮书
https://software.intel.com/en-us/articles/intel-sdm

内联汇编

变量地址总结 

 一个变量的地址值,是它所有字节地址中的最小值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CSP认证是指各个国家或地区针对信息安全领域的人员进行的认证考试。CSP认证考试的内容主要包括C语言语法要求,是考察考生在C语言编程方面的理论知识和实际运用能力的考试。C语言作为一种高级编程语言,广泛应用于软件开发、嵌入式系统、操作系统等领域,因此掌握C语言语法要求对于从事相关工作的人员来说非常重要。 CSP认证中的C语言语法要求主要包括变量的定义与使用、运算符的使用、控制结构的使用、函数的定义与调用等。考生需要熟悉C语言的数据类型、运算符的优先级、条件语句、循环语句等基本语法知识,并能够灵活运用这些知识解决实际问题。 通过CSP认证考试,考生不仅需要掌握基本的C语言语法,还需要了解C语言的一些常用函数库和标准规范,如头文件的使用、库函数的调用等。此外,考生还需要具备良好的编程习惯和调试能力,能够编写出高效、健壮、可读性强的C语言程序。 CSP认证 C语法要求的考试内容比较全面,不仅要求考生掌握C语言的基本语法,还需要了解C语言的进阶知识和应用技巧。通过CSP认证考试取得认证证书对于求职者来说具有较大的竞争优势,也是从事C语言编程工作的必备证书之一。因此,希望有意向的人员能够加强对C语言的学习和理解,提高编程能力,争取在CSP认证考试中取得好成绩。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值