C语言中的typedef详解

typedef声明,简称 typedef,为现有类型创建一个新的名字。比如人们常常使用 t ypedef来编写更美观和可读的代码。所谓美观,意指typedef能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性。

typedef使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图。类型出现在所声明的变量名字中,位于 ''typedef''关键字右边。例如:typedef int size;

此声明定义了一个 int的同义字,名字为 size。注意 typedef并不创建新的类型。它仅仅为现有类型添加一个同义字。你可以在任何需要 int的上下文中使用 size.

typedef 还可以掩饰符合类型,如指针和数组。例如,你不用象下面这样重复定义有 81个字符元素的数组:

charline[81]; char text[81];

定义一个typedef,每当要用到相同类型和大小的数组时,可以这样: typedef char Line[81]; Line text, secondline;

typedef 有另外一个重要的用途,那就是定义机器无关的类型,例如,你可以定义一个叫 REAL的浮点类型,在目标机器上它可以i获得最高的精度:

typedef long double REAL;

在不支持long double的机器上,该 typedef看起来会是下面这样:typedef double REAL;

并且,在连double都不支持的机器上,该 typedef看起来会是这样:typedef float REAL;

你不用对源代码做任何修改,便可以在每一种平台上编译这个使用 REAL类型的应用程序。唯一要改的是 typedef本身。在大多数情况下,甚至这个微小的变动完全都可以通过奇妙的条件编译来自动实现。不是吗?标准库广泛地使用 typedef来创建这样的平台无关类型:size_t, ptrdiff和 fpos_t 就是其中的例子。此外,象 st d::string和 std::ofstream这样的 typedef还隐藏了长长的,难以理解的模板特化语法,例如:basic_string<char, char_traits<char>, allocator<cha r>>和 basic_ofstream<char, char_traits< char>>。注1:注意typedef与 define 的区别

typdef   int * a,b

则a,b类型相同

define  int *  a,b

则a,b 类型不同注2:

typedef  int (*mac_listen_func)(int*,char*); mac_listen_func mlf1,mlf2;

等价定义:

int(*mlf1)(int*,char*); int (*mlf1)(int*,char*);

上面的方式使用比较方便,可读性也比较好。

typedef声明,简称 typedef,为现有类型创建一个新的名字。比如人们常常使用 typedef来编写更美观和可读的代码。所谓美观,意指typedef能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性。本文下面将竭尽全力来揭示 typedef强大功能以及如何避免一些常见的陷阱。

如何创建平台无关的数据类型,隐藏笨拙且难以理解的语法?

使用 typedefs为现有类型创建同义字。

定义易于记忆的类型名  typedef使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图。类型出现在所声明的变量名字中,位于 ''typedef''关键字右边。例如:

typedef int size;

此声明定义了一个 int的同义字,名字为 size。注意 typedef并不创建新的类型。它仅仅为现有类型添加一个同义字。你可以在任何需要 int的上下文中使用

size:

void measure(size * psz);

size array[4];

size len = file.getlength();

std::vector <size> vs;

typedef还可以掩饰符合类型,如指针和数组。例如,你不用象下面这样重复定义有 81个字符元素的数组:

char line[81];

char text[81];

定义一个 typedef,每当要用到相同类型和大小的数组时,可以这样:

typedef char Line[81];

Line text, secondline;

getline(text);

同样,可以象下面这样隐藏指针语法:

typedef char * pstr;

int mystrcmp(pstr, pstr);

这里将带我们到达第一个typedef陷阱。标准函数 strcmp()有两个‘constch ar *’类型的参数。因此,它可能会误导人们象下面这样声明 mystrcmp():

int mystrcmp(const pstr, const pstr);

这是错误的,按照顺序,‘constpstr’被解释为‘char * const’(一个指向cha r 的常量指针),而不是‘const char *’(指向常量char的指针)。这个问题很容易解决:

typedef const char * cpstr;

int mystrcmp(cpstr, cpstr); //现在是正确的

记住:不管什么时候,只要为指针声明typedef,那么都要在最终的 typedef名称中加一个const,以使得该指针本身是常量,而不是对象。

时间: 2025-01-27 13:48:50

C语言中的typedef详解的相关文章

详解C++中的const关键字及与C语言中const的区别_C 语言

const对象默认为文件的局部变量,与其他变量不同,除非特别说明,在全局作用域的const变量时定义该对象的文件局部变量.此变量只存在于那个文件中中,不能别其他文件访问.要是const变量能在其他文件中访问,必须显示的指定extern(c中也是)   当你只在定义该const常量的文件中使用该常量时,c++不给你的const常量分配空间--这也是c++的一种优化措施,没有必要浪费内存空间来存储一个常量,此时const int c = 0:相当于#define c 0:    当在当前文件之外使用

Go语言中io.Reader和io.Writer的详解与实现_Golang

一.前言 也许对这两个接口和相关的一些接口很熟悉了,但是你脑海里确很难形成一个对io接口的继承关系整天的概貌,原因在于godoc缺省并没有像javadoc一样显示官方库继承关系,这导致了我们对io接口的继承关系记忆不深,在使用的时候还经常需要翻文档加深记忆. 本文试图梳理清楚Go io接口的继承关系,提供一个io接口的全貌. 二.io接口回顾 首先我们回顾一下几个常用的io接口.标准库的实现是将功能细分,每个最小粒度的功能定义成一个接口,然后接口可以组成成更多功能的接口. 最小粒度的接口 typ

详解C语言中scanf函数使用的一些注意点_C 语言

 (一)基本介绍 Scanf是系统自带的函数,声明包含在stdio.h文件中,因此要是有该函数,必须加载#include<stdio.h>头文件.当执行到scanf函数时,程序就暂停等待用户输入,该函数只接受变量的地址,格式为&变量名.是一个阻塞式的函数,2用户输入完毕后,则将值赋值给变量,至此函数调用完毕.敲回车键告知计算机键入完毕. (二)使用注意 ①. 使用scanf函数输入一个字符变量.Char a; scanf("%c",&a); ②. 同时输入多

详解C语言中fseek函数和ftell函数的使用方法_C 语言

fseek函数: int fseek(FILE * _File, long _Offset, int _Origin); 函数设置文件指针stream的位置.如果执行成功,stream将指向以fromwhere为基准,偏移offset(指针偏移量)个字节的位置,函数返回0.如果执行失败则不改变stream指向的位置,函数返回一个非0值. 超出文件末尾位置,还是返回0.往回偏移超出首位置,还是返回0,小心使用. 第一个参数stream为文件指针. 第二个参数offset为偏移量,正数表示正向偏移,

详解Ruby语言中的String

Ruby语言中的String是mutable的,不像java.C#中的String是immutable的.比如 str1="abc" str2="abc" 在java中,对于字面量的字符串,jvm内部维持一张表,因此如果在java中,str1和str2是同一个 String对象.而在Ruby中, str1和str2是完全不同的对象.同样,在java中对于String对象的操作都将 产生一个新的对象,而Ruby则是操纵同一个对象,比如: str="abc&q

C语言中void*详解及应用

 void在英文中作为名词的解释为"空虚:空间:空隙":而在C语言中,void被翻译为"无类型",相应的void *为"无类型指针".void似乎只有"注释"和限制程序的作用,当然,这里的"注释"不是为我们人提供注释,而是为编译器提供一种所谓的注释. 本文地址:http://www.cnblogs.com/archimedes/p/c-void-point.html,转载请注明源地址. void的作用: 1

详解C语言中printf输出的相关函数_C 语言

C语言printf()函数:格式化输出函数printf()函数是最常用的格式化输出函数,其原型为: int printf( char * format, ... ); printf()会根据参数 format 字符串来转换并格式化数据,然后将结果输出到标准输出设备(显示器),直到出现字符串结束('\0')为止. 参数 format 字符串可包含下列三种字符类型: 一般文本,将会直接输出 ASCII 控制字符,如\t.\n 等有特定含义 格式转换字符 格式转换为一个百分比符号(%)及其后的格式字符

详解C语言中rand函数的使用_C 语言

前言 我们在编程实现算法的过程中,往往需要使用到随机数.由于计算机是一台以逻辑为基础的机器,没法做到真正的随机(大概量子计算机可以?).所以计算机生成的是伪随机数,供我们使用. 我们使用C语言的rand函数,生成的也是伪随机数. c语言之rand函数的使用 1.写入头文件 #include <stdlib.h> #include <stdio.h> #include <time.h> 2.变量的定义 void main( void ) { int i,k; 3.sran

详解C语言中symlink()函数和readlink()函数的使用_C 语言

C语言symlink()函数:建立文件符号连接头文件: #include <unistd.h> 定义函数: int symlink(const char * oldpath, const char * newpath); 函数说明:symlink()以参数newpath 指定的名称来建立一个新的连接(符号连接)到参数oldpath 所指定的已存在文件. 参数oldpath 指定的文件不一定要存在, 如果参数newpath 指定的名称为一已存在的文件则不会建立连接. 返回值:成功则返回0, 失败