C++进阶之浅谈typedef

原创 2016年08月28日 15:18:30

背景

一直以来,对typedef的理解都很粗浅,用的倒是不亦乐乎。直到前阵子,看到这样一段代码

typedef char  MyArray[32];
....

int main()
{
    MyArray array = {0};
}

虽然能看懂这段代码,也知道是怎么回事,但对于上面的typedef语句的细节处理还是有一些困惑,索性就查了一下。原理其实很简单,但有些细节若理解不清晰,也容易犯错,所以特此记录一下。


关于typedef

关于typedef的用法以及与宏定义的区别,不是本文记录的重点,在此推荐两篇说的比较清晰的博客:

关于typedef的用法

使用typedef语句定义数组类型

其实语言本身的原理很简单,关键是使用过程中的一些需要注意的小细节,能否驾驭得了细节,才是是否真正掌握原理的体现。



细节之处见真知

通过上面推荐的两篇博客,已经可以知道,通过使用typedef,所定义的已经不单单是某个表达式或者类型的别名,而是一个自定义的类型了,我们可以将它与int, double, char等归为一类,都是现在程序中,我们可以用来定义变量的某个类型。通过下面的例子,可以更好的理解上面的说明。(其实上面一句话,就是本文想说明的重点,对自己也对其他看到本博客的人)


#include <iostream>

using namespace std;

typedef char MyArray[32];

void show_par_sizeof(MyArray typedef_array, char* normal_array)
{
    printf("sizeof(typedef_array) = %d\n", sizeof(typedef_array));
    printf("sizeof(MyArray) = %d\n", sizeof(MyArray));
    printf("sizeof(normal_array) = %d\n", sizeof(normal_array));
}


int main() {
    MyArray test_typedef_array = {0};
    char test_normal_array[32] = {0};

    printf("sizeof(test_typedef_array) = %d\n", sizeof(test_typedef_array));
    printf("sizeof(MyArray) = %d\n", sizeof(MyArray));
    printf("sizeof(test_normal_array) = %d\n", sizeof(test_normal_array));

    show_par_sizeof(test_typedef_array, test_normal_array);

    return 0;
}


这段代码对应的输出为:




由输出,再结合上面的代码,有两个关键细节值得注意:

1、为什么sizeof(MyArray) = 32;
2、由代码可知test_typedef_array实际上是一个32位的字符型数组,在main中调用show_par_sizeof函数时是以test_typedef_array为参数的,为什么在show_par_sizeof函数定义时,第一个参数为MyArray typedef_array,按照之前对数组的理解,应该为指针类型才对呀;

关于第一个问题,这里要强调的就是上面说过的话,typedef定义的是一个可以和int, double类比的新类型,所谓类型,即是一个整体性的概念。这里MyArray就是被typedef定义成一个代表32字节的字符型数组的新类型,就像sizeof(int) = 4一样,这样就可以理解为啥sizeof(MyArray) = 32了。

关于第二个问题,就是一个比较扭曲的问题,所以我在程序中同时定义了一个正常的字符型数组作为对比。我得出的结论是,虽然从定义形式上区别很大,但MyArray到底层编译器解析时就是分配一个32字节的空间,然后将首地址与test_typedef_array绑定,与正常的字符数组并没有差别。因此,我们完全就可以把test_typedef_array当成是通过char test_typedef_array[32]定义的字符数组的数组名进行使用。而关于上面的问题,我的猜想是,当编译器进行编译时,会将show_par_sizeof函数定义中的MyArray typedef_array解析成char *typedef_array,这也就是为什么在show_par_sizeof函数中打印出来的信息,typedef_array和normal_array的大小是一样的,都是一个指针的大小(64位系统)。

为了验证上面的猜想,改了下程序:

#include <iostream>

using namespace std;

typedef char MyArray[32];

void show_par_sizeof(char* typedef_array, char* normal_array)
{
    printf("sizeof(typedef_array) = %d\n", sizeof(typedef_array));
    printf("sizeof(MyArray) = %d\n", sizeof(MyArray));
    printf("sizeof(normal_array) = %d\n", sizeof(normal_array));
}


int main() {
    MyArray test_typedef_array = {0};
    char test_normal_array[32] = {0};

    printf("sizeof(test_typedef_array) = %d\n", sizeof(test_typedef_array));
    printf("sizeof(MyArray) = %d\n", sizeof(MyArray));
    printf("sizeof(test_normal_array) = %d\n", sizeof(test_normal_array));

    show_par_sizeof(test_typedef_array, test_normal_array);

    return 0;
}


果然能够编译通过,运行结果为:



与之前的结果完全一样,因此验证猜想。


有了解底层编译原理的大神,希望能够在评论中,对第二个问题从编译器的角度进行下详细阐述,不胜感激。


版权声明:本文为博主原创文章,未经博主允许不得转载。

C++枚举类型和typedef声明新的类型名

如果一个变量只能有几种可能的值,可以定义为枚举类型。所谓枚举类型就是把变量的值一一列举出来,变量的值只能在列举出来的值的范围内。enum weekday{sun,mon,tue,wed,thu,fri...
  • qq_28234213
  • qq_28234213
  • 2017年06月12日 21:21
  • 207

typedef 的用法,typedef写在类里面的作用

平时,我meng
  • dalleny
  • dalleny
  • 2014年09月03日 01:19
  • 4915

c++ 类中typedef的类型别名的作用

typedef long INDEX 给long这样的类型起别名,它有两个用处:一是表明该类型的特殊作用,二是将来有可能要改变这种类型(比如提高精度), 但是现在了解到可以在class类里面使用...
  • yang9649
  • yang9649
  • 2016年12月07日 11:43
  • 906

C/C++ typedef用法详解(真的很详细)

转自:http://blog.csdn.net/ameyume/article/details/6326278 第一、四个用途 1.1 用途一: 定义一种...
  • Lee_Shuai
  • Lee_Shuai
  • 2016年11月20日 17:16
  • 876

【C++进阶】深入理解C/C++(4)

【C++进阶】深入理解C/C++(4) 总结一下第三讲,我们可以知道,相对于第一位候选者,第二位候选者在以下几个方面有更深的认识: 1、  C与C++的联系; 2、 ...
  • fu_zk
  • fu_zk
  • 2014年02月19日 15:23
  • 1267

C++ 宏定义和 typedef 的区别

宏定义#define为预处理指令,在编译处理时进行简单的文本替换,不作正确性检查,不关含义是否正确照样带入,只在编译已被展开的源程序时才会发现可能的错误并报错。   typedef为复杂的声明定义...
  • misayaaaaa
  • misayaaaaa
  • 2017年04月06日 09:25
  • 619

C++高级进阶 第一季:const 详解

零、文章来由打算将基础知识在看书的同时系统的整理一下,方便大家也方便自己。整理的知识尽量参照书本知识,比网上获取的资料有更高的可信度。一、从 文字常量和常变量 开始补充:const并没有想象中的那么简...
  • Scythe666
  • Scythe666
  • 2016年03月05日 10:11
  • 1454

C++那些细节--typedef关键字

关于typedef关键字,以前刚刚学C语言的时候,用它来重定义结构体别名。之后的话就是在用函数指针的时候用过一些,然而并不知道这个还有什么用处。今天花点时间总结一下typedef的细节。 一.简介 在...
  • puppet_master
  • puppet_master
  • 2015年09月16日 00:26
  • 1323

宏定义与typedef不能说的秘密

研究问题 宏定义#define与定义别名typedef使用方法 define与typedef区别 要点: 宏定义#define为预处理指令在编译处理时进行简单的替换,不作正确性检查,不关含义是否正确照...
  • qq_31360933
  • qq_31360933
  • 2017年01月06日 21:57
  • 820

C++进阶必读书籍

结合一些我的学习经历,希望对于想学C++的人有些帮助. 大家有什么好想法望提出 我老师最初是从C语言教起的,用的是潭浩强的>这本书,那时候命令执行都是在CMD里实现,用的编译器是turboc最经常用...
  • chenqiai0
  • chenqiai0
  • 2014年01月25日 10:03
  • 7431
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++进阶之浅谈typedef
举报原因:
原因补充:

(最多只允许输入30个字)