IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 技术之编译器检查 -> 正文阅读

[C++知识库]技术之编译器检查

编译器检查

特点:

  1. 静态类型检查
  2. 可定制类型错误消息

例子:实现安全转型的函数,并确保较大型别不能转换成较小型别。
迭代一

template <typename To, typename From>
To safe_reinterpret_cast(From from)
{
	assert(sizeof(From) < sizeof(To));
	return reinterpret_cast<To>(from) ;
}

上述代码,会在执行期进行断言。
迭代二 期待编译期识别出错误,利用编译器做类型安全检查
方案一:
利用基本语法规则:大小为零的数组是非法的。

#define STATIC_ASSERT(expr) { char unnamed[(expr) ? 1 : 0]; }

template <typename To, typename From>
To safe_reinterpret_cast(From from)
{
	STATIC_ASSERT(sizeof(From) < sizeof(To));
	return reinterpret_cast<To>(from) ;
}

如果尝试将int*类型转换成char类型,书上说编译器将抱怨“正试着产生一个长度为零的数组”。

int* i = new int(100);
char ch = safe_reinterpret_cast<char>(i);

但新的编译器已经能完全给出更加易理解的信息:

<source>: In instantiation of 'To safe_reinterpret_cast(From) [with To = char; From = int*]':
<source>:21:40:   required from here
<source>:14:9: error: cast from 'int*' to 'char' loses precision [-fpermissive]
  return reinterpret_cast<To>(from) ;

方案二
利用模板特化,提供带有特定意义的 template类型名称,出错时编译器能打印出template类型名称。

template<bool> struct CompileTimeError;
template<> struct CompileTimeError<true> { };
#define STATIC_ASSERT(expr) (CompileTimeError<(expr)>())

上面使用,编译失败信息如下:

<source>:10:30: error: invalid use of incomplete type 'struct CompileTimeError<false>'
 #define STATIC_ASSERT(expr) (CompileTimeError<(expr)>())
                             ~^~~~~~~~~~~~~~~~~~~~~~~~~~~
<source>:15:2: note: in expansion of macro 'STATIC_ASSERT'
  STATIC_ASSERT(sizeof(From) < sizeof(To));
  ^~~~~~~~~~~~~
<source>:8:23: note: declaration of 'struct CompileTimeError<false>'
 template<bool> struct CompileTimeError;

从上述错误提示信息看出,CompileTimeError提示还没有表示出具体的意义。
迭代三 改良错误提示信息

template<bool> 
struct CompileTimeChecker
{
	CompileTimeChecker( ...);
};

template<> 
struct CompileTimeChecker<false> 
{};
#define STATIC_ASSERT(expr, msg) \
{ \
	 class ERROR_##msg{}; \
  (void)sizeof(CompileTimeChecker<(expr)>(ERROR_##msg( ))); \
}

template <typename To, typename From>
To safe_reinterpret_cast(From from)
{
	STATIC_ASSERT(sizeof(From) < sizeof(To), destination_type_too_narrow);
	return reinterpret_cast<To>(from);
}

上例中编译出错提示信息:

<source>:27:2: note: in expansion of macro 'STATIC_ASSERT'
  STATIC_ASSERT(sizeof(From) < sizeof(To), destination_type_too_narrow);

能明确提示具体错误原因。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章           查看所有文章
加:2022-03-21 20:30:30  更:2022-03-21 20:35:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:56:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码