【C++_typedef_疑难定义收集整理】

简介:
(注:文章谨代表个人理解,如有错误,还望尽快指正,大家都能获益,我定感激不尽^^)
 
至今已遇到两个typedef诡异的定义,因此决定下笔记之,以备后用。
 
 
 
【typedef之const指针】
 
【案例】
typedef string * pstr; 
const pstr cpstr;
问上述代码中cpstr是一个怎样的指针?
 
【分析】
很多朋友,包括我自己在刚接触到时,第一反应是:cpstr被定义为一个指向const string对象的普通指针,原因很简单,置换一下string*与pstr的位置就得到
//这显然就是一个指向const string对象的普通指针 
const string * cpstr; 
 
然而,事不如人愿,cpstr的确切定义为:一个指向string类型的const指针。
看到这个答案,想必不少朋友稍显惊讶,我也如此,其中内因,且听我慢慢道来。
 
之所以出错,在于我们“置换一下就好了”,“置换”这个词不应该用在typedef,而该用在#define宏身上,typedef是定义了一个类型别名,定义的结果遵循任何正常定义的标准。那么这个typedef到底是怎么定义了一个const指针呢?
首先分析
const pstr cpstr;
这段代码定义了一个pstr类型的const cpstr,实际上就是
pstr const cpstr;
为了便于理解,就拿int定义来说
//二者等价,前者是习惯用法,后者是标准规定 
const int ival = 0; 
int const ival = 0; 

 
既然理解了cpstr是一个const的pstr类型的对象,pstr是什么呢?pstr是string*,因此这样一来,就成了cpstr是一个const的string*类型的对象,也即cpstr是一个指向普通string的const指针。
 
【总结】
本次误解主要源于大家认为typedef等同于#define宏定义,以为简单替换字符就可以了。实则不然。以后见到这样的定义,最简单的办法就是从定义该变量的地方入手
typedef string * pstr; 
const pstr cpstr;
按步骤(熟练了就很快了)思考:
①cpstr是一个类型为 pstr 的常量
②pstr 是什么?
③pstr 是 string*
④所以,cpstr是一个类型为 string* 的常量,也即 string *const cpstr
 
 
 
【typedef之函数类型】
 
【案例】
typedef int FUNC (int);
请问typedef定义了一个什么类型?
 
【分析】
不要惊讶,就是这样,它不是一个函数指针,也不是被我写错了。
它定义了一个函数类型FUNC,这个函数类型要求一个int形参,返回一个int结果。
 
【总结】
FUNC TestFunc(FUNC F);
 
FUNC的用法是有限制的,上述语句会导致编译时错误。
上述代码使用了两次FUNC,出错的是第一个,也就是FUNC类型的函数返回类型是有错的。
FUNC是函数类型,在另一个函数中,函数类型变量只能够用作另一个函数的形参,而不能是返回类型。
FUNC用作形参时,编译器会自动将其转换为FUNC* /*函数指针*/,而编译器不会将作为函数返回类型的FUNC进行转换,因此会出现编译时错误,可修正如下
FUNC* TestFunc(FUNC F);
声明了一个函数TestFunc,该函数要求一个函数类型为FUNC的函数F作为形参,并返回一个FUNC类型的函数指针FUNC*









【typedef与#define】

【案例】
typedef int* Tpi;

#define int* Dpi;

Tpi p1,p2;
Dpi p3,p4;
问上述代码中定义的四个变量分别为什么类型?


【分析】
区分p1,p2,p3,p4四个变量的类型,首先要理解typedef和#define宏的区别,typedef是给已有的类型取别名,而#define只是简单的字符替换。于是上述代码等同于
int *p1,*p2; //typedef的作用
int *p3,p4; //#define的作用
也就是说p3被定义为了一个整型指针,而p4则只是整型。


【总结】
需要掌握typedef与#define的区别,以防这些细微的陷阱,为高质量代码做好保障。

     本文转自Bill_Hoo 51CTO博客,原文链接:http://blog.51cto.com/billhoo/519582 ,如需转载请自行联系原作者








相关文章
|
8月前
|
C++
C++中类的定义与使用
C++中类的定义与使用
214 2
|
20天前
|
存储 程序员 C++
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
55 0
|
2月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
156 4
|
8月前
|
C++
C++程序中的类声明与对象定义
C++程序中的类声明与对象定义
88 1
|
3月前
|
存储 编译器 C语言
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
56 2
|
3月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
68 1
|
4月前
|
C++
HTML+JavaScript构建一个将C/C++定义的ANSI字符串转换为MASM32定义的DWUniCode字符串的工具
HTML+JavaScript构建一个将C/C++定义的ANSI字符串转换为MASM32定义的DWUniCode字符串的工具
|
6月前
|
编译器 C++ 运维
开发与运维函数问题之函数的返回类型如何解决
开发与运维函数问题之函数的返回类型如何解决
44 6
|
5月前
|
编译器 C++
【C/C++学习笔记】C++声明与定义以及头文件与源文件的用途
【C/C++学习笔记】C++声明与定义以及头文件与源文件的用途
66 0
|
5月前
|
JSON Android开发 数据格式
Android c++ core guideline checker 应用问题之JSON compilation database的定义如何解决
Android c++ core guideline checker 应用问题之JSON compilation database的定义如何解决