一行很常用的代码:

typedef int XX_Size_Check[(sizeof(XX)==64)? 1:-1];

很容易猜到上面这行代码是要在编译时检查XX的size,但再深究点,我们就会发现它跟我们平时typedef的写法不太一致。

typedef用法小结

对已有类型定义别名

typedef <old type name> <new alias>;

这是最常见的写法,主要用途有

  • 结构体

举个例子,我们这里定义了一个结构体MyStruct,在C里面,如果要定义该类型的变量,则需要写struct关键字。(C++里在不产生歧义的情况下可以省略。)

struct MyStruct {
int data1;
char data2;
};
struct MyStruct a;

我们可以使用typedef来简化书写:

typedef struct MyStruct newtype;

newtype a;

当然也可以直接写成这样:

typedef struct MyStruct {
int data1;
char data2;
} newtype;

或者更简单的:

typedef struct {
int data1;
char data2;
} newtype;
  • 指针
typedef struct Node* NodePtr;
...
NodePtr startptr, endptr, curptr, prevptr, errptr, refptr;

函数指针

不使用typedef,我们会这样写:

int do_math(float arg1, int arg2) {
return arg2;
} int call_a_func(int (*call_this)(float, int)) {
int output = call_this(5.5, 7);
return output;
} int final_result = call_a_func(&do_math);

使用typedef:

typedef int (*MathFunc)(float, int);

int do_math(float arg1, int arg2) {
return arg2;
} int call_a_func(MathFunc call_this) {
int output = call_this(5.5, 7);
return output;
} int final_result = call_a_func(&do_math);

这里typedef后面跟了一个函数指针类型 int (*MathFunc)(float, int),通过这个语句,MathFunc成为该函数指针类型的别名。

数组

typedef int vector[10];

vector a;
a[9] = 100;

和函数指针比较类似,typedef后面跟了一个数组类型(元素类型为int,数组长度为10),通过这个语句,vector成为该数组类型的别名。

也可以定义多维数组。

参考:

Wikipedia: typedef

Jason Damon: 使用typedef语句定义数组类型

typedef 详解的更多相关文章

  1. (六)C语言之typedef详解

    1.typedef可以看作type define的缩写,顾名思义就是类型定义,也就是说它只是给已有的类型重新定义了一个方便使用的别名,并没有产生新的数据类型.typedef的使用与宏定义define有 ...

  2. C++ typedef详解

    1.typedef的用途1)定义一种类型的别名注意typedef并不是简单的宏替换,如下例所示: int main() { char *pa,pb;//声明了一个指向字符变量的指针pa,和一个字符变量 ...

  3. c/c++中typedef详解

    1. typedef 最简单使用 typedef long byte_4; // 给已知数据类型long起个新名字,叫byte_4 你可以在任何需要 long 的上下文中使用 byte_4.注意 ty ...

  4. C语言typedef详解

    原文链接 C语言允许用户使用 typedef 关键字来定义自己习惯的数据类型名称,来替代系统默认的基本类型名称.数组类型名称.指针类型名称与用户自定义的结构型名称.共用型名称.枚举型名称等.一旦用户在 ...

  5. C语言--enum,typedef enum 枚举类型详解

    原文:http://z515256164.blog.163.com/blog/static/32443029201192182854300/ 有改动 C语言详解 - 枚举类型 注:以下全部代码的执行环 ...

  6. sk_buff封装和解封装网络数据包的过程详解

    转自:http://www.2cto.com/os/201502/376226.html 可以说sk_buff结构体是Linux网络协议栈的核心中的核心,几乎所有的操作都是围绕sk_buff这个结构体 ...

  7. iOS开发——高级特性&Runtime运行时特性详解

    Runtime运行时特性详解 本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的动态特性,使这门古老的语言焕发生机.主要内容如下: 引言 ...

  8. Linux C 字符串函数 sprintf()、snprintf() 详解

    一.sprintf() 函数详解 在将各种类 型的数据构造成字符串时,sprintf 的强大功能很少会让你失望. 由于 sprintf 跟 printf 在用法上几乎一样,只是打印的目的地不同而已,前 ...

  9. trie字典树详解及应用

    原文链接    http://www.cnblogs.com/freewater/archive/2012/09/11/2680480.html Trie树详解及其应用   一.知识简介        ...

随机推荐

  1. Android中使用第三方jar包

    步骤: 方法1:Eclipse下, 右键工程, Build path, java build path, 选择libraries 在右边的按钮中点击“Add Library” 选择“User libr ...

  2. Unity3D Shader 半兰伯特光照模型

    //效果预览 //Shader代码 Shader "Unlit/HalfLambert" { Properties { _MainTex ("Texture", ...

  3. ELK之从6.3.1升级至6.6.2

    需要把原6.3.1版本升级为6.6.2版本 1,官网下载rpm包 2,升级elasticsearch和kibana rpm -U elasticsearch-6.6.2.rpm rpm -U kiba ...

  4. ie9 form submit 请求参数问题替代办法

    //隐藏表单 <input id="hdPeriod" name="period" type="hidden" value=" ...

  5. 试水Spring Cloud Hystrix

    Spring Cloud Hystrix是一个容错库,它实现了断路器模式,使得当服务发生异常时,会自动切断连接,并将请求引导至预设的回调方法. 服务端 在Spring Tool Suite的文件菜单中 ...

  6. ubuntu16.04 ROS环境下配置和运行SVO

    ubuntu16.04 ROS环境下配置和运行SVO https://blog.csdn.net/nnUyi/article/details/78005552

  7. {MySQL存储引擎介绍}一 存储引擎解释 二 MySQL存储引擎分类 三 不同存储引擎的使用

    MySQL存储引擎介绍 MySQL之存储引擎 本节目录 一 存储引擎解释 二 MySQL存储引擎分类 三 不同存储引擎的使用 一 存储引擎解释 首先确定一点,存储引擎的概念是MySQL里面才有的,不是 ...

  8. vsCode配置C++调试环境

    1.下载安装VSCode,安装mscpptools ,直接搜索c++,或者mscpptools 2.下载MinGW 安装好,一般默认安装到C:\MinGW 安装好后直接启动. 选择需要的gcc ,g+ ...

  9. ubuntu 安装NVIDIA驱动过程

    用U盘引导安装时,提示 nouveau 0000:65:00.0: fifo: SCHED_ERROR 08 [] 解决方法: 进入grub 内核启动参数后增加 nomodeset nomodeset ...

  10. 用SignalTap进行硬件仿真

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...