C++程序设计语言之几种通用的强制转换运算符

C++程序设计语言之强制转换运算符是一种特殊的运算符,它把一种数据类型转换为另一种数据类型。强制转换运算符是一元运算符,它的优先级与其他一元运算符相同。大多数的C++编译器都支持大部分通用的强制转换运算符:

(type)expression: type是转换后的数据类型。

const_cast(expr): const_cast运算符用于修改类型的const/volatile属性。除了const或volatile属性之外,目标类型必须与源类型相同。这种类型的转换主要是用来操作所传对象的const属性,可以加上const属性,也可以去掉const属性。
Continue reading

C++程序设计语言之类型限定符const、volatile和restrict

C++程序设计语言之类型限定符const、volatile和restrict,提供了变量的额外信息。

限定符 含义
const const类型的对象在程序执行期间不能被修改改变。
volatile 修饰符volatile告诉编译器不需要优化volatile声明的变量,让程序可以直接从内存中读取变量。对于一般的变量编译器会对变量进行优化,将内存中的变量值放在寄存器中以加快读写效率。
restrict 由restrict修饰的指针是唯一一种访问它所指向的对象的方式。只有 C99 增加了新的类型限定符 restrict。

Visual Studio在Release模式下开启Debug调试的方法

Visual Studio在Release模式下开启Debug调试,该模式在保留Release模式下运行快速的前提下,又可以给特定的工程开启Debug模式,进行针对性的调试。这样比整个项目都采用Debug模式进行编译,在调试时会提高效率。Visual Studio在Release模式下开启Debug调试的方法如下:

1、 项目 ——> 属性 ——> C/C++ ——> 常规 ——> 调试信息格式 ——> 程序数据库 (/Zi) 。

2、 项目 ——> 属性 ——> C/C++ ——> 常规 ——> 优化 ——> 优化 ——> 已禁用 (/Od)。

3、 项目 ——> 属性 ——> 链接器 ——> 调试 ——> 生成调试信息 ——> 生成调试信息 (/DEBUG)。

C++语言程序设计之处理复合表达式的两条经验准则

在C++语言中,以下两条经验准则对书写复合表达式有益:

1、拿不准的时候最好用括号来强制让表达式的组合关系符合程序逻辑的要求。

2、如果改变了某个运算对象的值,在表达式的其他地方不要再使用这个运算对象。

第2条规则有个重要的例外,当改变运算对象的子表达式本身就是另外一个子表达式的运算对象时该规则无效。例如,在表达式*++iter中,递增运算符改变了iter的值,求值的顺序不会成为问题,因为递增运算(即改变运算对象的子表达式)必须先求值,然后才轮到解引用运算。显然,这是一种很常见的用法,不会造成什么问题。

C++语言程序设计之智能指针基本规范和陷阱

智能指针可以提供对动态分配的内存安全而又方便的管理,但这建立在正确使用的前提下。为了正确使用智能指针,我们必须坚持一些基本规范:

1、不使用相同的内置指针值初始化(或reset)多个智能指针。
2、不delete get()返回的指针。
3、不使用get()初始化或reset另一个智能指针。
4、如果你使用get()返回的指针,记住当最后一个对应的智能指针销毁后,你的指针就变为无效了。
5、如果你使用智能指针管理的资源不是new分配的内存,记住传递给它一个删除器。

C++语言程序设计之map和unordered_map的下标操作

在C++语言中,对于一个map使用下标操作,其行为与数组或vector上的下标操作很不相同:使用一个不在容器中的关键字作为下标,会添加一个具有此关键字的元素到map中。

一、c[k]
返回关键字为k的元素;如果k不在c中,添加一个关键字为k的元素,对其进行值初始化。

二、c.at(k)
访问关键字为k的元素,带参数检查;若k不在c中,抛出一个out_of_range异常。

C++语言之new和delete管理动态内存的三个常见问题

在C++语言中,使用new和delete管理动态内存存在的三个常见问题:

1、忘记delete内存
忘记释放动态内存会导致人们常说的“内存泄露”问题,因为这种内存永远不可能被归还给自由空间了。查找内存泄露错误是非常困难的,因为通常应用程序运行很长时间后,真正耗尽内存时,才能检测到这种错误。

2、使用已经释放的对象
通过在释放内存后将指针置为空,有时可以检测出这种错误。
Continue reading

STM32微控制器之直接内存访问DMA的使用方法

直接内存访问(Direct Memory Access,DMA)是微控制器的一个外设,它的主要功能是用来搬运数据,而不需要占用CPU,即在传输数据的时候,CPU可以干其他的事情。

STM32F103微控制器的两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道),每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个DMA请求的优先权。

仿真软件:Proteus 8.11 SP0,仿真STM32F103R6微处理器的DMA:内存到外设USART1,代码如下:
Continue reading

STM32微控制器之全双工串口通信USART的使用方法

USART:通用同步/异步串行接收/发送器(Universal Synchronous/Asynchronous Receiver/Transmitter),通常称作USART。是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。
UART:通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),它是在USART 基础上裁剪掉了同步通信功能,只有异步通信。
简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本上都是UART。
Continue reading

STM32微控制器之系统滴答定时器SysTick的使用方法

系统滴答定时器(System tick timer,简称SysTick),属于STM32微控制器内核中的一个外设,内嵌在NVIC中。系统定时器是一个24bit向下递减的计数器,计数器每计数一次的时间为1/SYSCLK。当重装载数值寄存器的值递减到0的时候,系统定时器就产生一次中断,以此循环往复。

实验程序:利用SysTick,设置微处理器1ms产生一次中断,并实现精确延时函数,控制LED灯开关状态的反转。
Continue reading