typedef可以成为你的朋友
typedef static char int8;这个声明正确吗?
A:err
所以上面那个声明是错误的。
typedef为一种类型引入新的名字,而不是为变量分配空间,它并没有引入新的类型,而是为现有的类型取个新名字。在说到typedef时,有一个很好的例子是signal()函数声明,但是,一般而言只有极少数情况才会使用到这样的技巧,这里就不再赘述,我们应该知道更多关于typedef对于大多数程序员应该知道的事。
说到typedef就不能不说一下它的缺点。它同样具有与其他声明一样的混乱语法。可以把几个声明器塞到一个声明中去,例如:
typedef int *ptr,(*fun)(void),arr[];
ptr是指向int的指针类型;
fun是指向返回值为int的参数为void的函数的指针类型;
arr是长度为5的int型数组类型。
上面这样的写法应该尽量避免使用。
甚至typedef的位置不是必须放在声明的开始部分,例如:
#include<stdio.h> int main(void)
{
int typedef a;
a b=;
printf("%d\n",b);
return ;
}
也不要把typedef嵌入到声明的中间部分,如下所示:
unsigned long typedef int volatile *kumquat;
这样的表达式会让代码变得不好阅读!!!
我们使用typedef,是为了使代码更易于阅读,给已有类型取一个我们喜欢的别名,不要滥用或者乱用它。
再来看看typedef和define的区别
最基本的区别:
#define mychar char*
mychar a,b;
typedef char * yourchar;
yourchar c,d;
define是纯文本替换,如果用define定义的类型定义多个对象,那样只有第一个对象才是原本define的类型,在上面的例子中,b是char不是char*类型,但是c和d都是char *类型。
还有一个区别:
typedef是一种彻底的“封装”,在声明它之后不能再往里面增加别的东西,这和宏不同。
#define peach int
unsigned peach i;//right
typedef int banana;
unsigned banana j;//err
知道这些之后,我们平时书写代码就应该遵循一些规范,把typedef放在声明的开始,并且一个类型用一个typedef修饰,不要在typedef类型前后加其他声明器。
C语言存在多种名字空间:
。标签名
。标签:这个名字空间用于所有的结构、枚举、联合。
。成员名:每个结构或联合都有自身的名字空间
。其他
在同一个名字空间里,任何名字必须具有唯一性,但在不同的名字空间里可以存在相同的名字。
由于在不同的名字空间使用同一个名字是合法的,所以这样的代码是可以通过编译的,但还是不建议这样书写。
struct foo{int foo;}foo;
typedef struct baz{int baz;} baz;
struct baz var1;
baz var2;
这些都是合法的。只有结构标签能够在以后的声明中使用(注意了!)。可以用typedef定义一个结构类型,这样可以省略struc的书写,也可以直接用struct 标签 变量的方式,就算使用了typedef也一样。
在使用typedef的时候,应该尽量避免混淆,做到思路清晰,代码可读性高。
再看一例:
#include<stdio.h>
typedef char * test;
int main(void)
{
const char * str=;
str++;// 正确底层const,常量指针,该指针指向的对象是常量,但指针自身可以改变
const test string=;
string++;//错误,typedef出的是类型别名 char *,此时加const修饰为指针常量,即该指针是常量。
return ;
}
前面说了,不要在使用了typedef的标识符前后再加修饰(上面例子在typedef声明的别名test前又加了一个const修饰),那样有可能和你想的不同。知道可能的坑,并善于利用typedef带给我们的便利,typedef可以成为你的朋友。
typedef可以成为你的朋友的更多相关文章
- C语言学习书籍推荐《C专家编程Expert C Programming Deep C Secrets》下载
Peter Van Der Linden (作者) <C和C++经典著作 C专家编程Expert C Programming Deep C Secrets>展示了C程序员所使用的编码技巧, ...
- 19-typedef
本文目录 一.typedef作用简介 二.typedef与指针 三.typedef与结构体 三.typedef与指向结构体的指针 四.typedef与枚举类型 五.typedef与指向函数的指针 六. ...
- #define与typedef在重定义类型中的区别
#define 为完全的替换 typedef 重新定一个数据类型 eg #define charp1 char* typedef char* charp2charp1 a,b; //a char* b ...
- typedef
第一.四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换.可以用作同时声明指针型的多个对象.比如:char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, ...
- 用typedef定义函数指针的问题
在学习windows API的时候,遇到下面这段代码 以前见过的typedef的用法都是给一个数据类型取一个别名 typedef oldTypeName newTypeName 这种给数据类型 ...
- C语言语法 typedef小结
在总结typedef之前,先了解一个专业术语: 常量指针(const pointer):常量指针在定义的时候必须被初始化,而且一旦初始化完成,则它的值就不能再改变. int errNumb = 0; ...
- 如何理解typedef void (*pfun)(void)
问题: 在刚接触typedef void (*pfun)(void) 这个结构的时候,存在疑惑,为什么typedef后只有一"块"东西,而不是两"块"东西呢?那 ...
- C及C++中typedef的简单使用指南
又是在学数据结构的时候,发现了之前学习的知识遗忘很多,在发现对C/C++中关键字typedef的理解还是没有到位后,我翻阅了学C++用到的课本,又问了度娘,也看了不少关于typedef用法的博客.于是 ...
- [转]关于typedef的用法总结
不管实在C还是C++代码中,typedef这个词都不少见,当然出现频率较高的还是在C代码中.typedef与#define有些相似,但更多的是不同,特别是在一些复杂的用法上,就完全不同了,看了网上一些 ...
随机推荐
- Ubuntu - 硬盘分区、格式化、自动挂载配置
Ubuntu系统的硬盘空间不够用了,需要增加新的硬盘扩容.将硬盘分区.格式化.自动挂载配置的整个过程记下来,备忘. 运行环境 | Enviroment Ubuntu 10.10 一.硬盘分区 | Ha ...
- raymarching
http://www.michaelwalczyk.com/blog/2017/5/25/ray-marching https://kosmonautblog.wordpress.com/2017/0 ...
- TensorFlow------读取二进制文件实例
TensorFlow------读取二进制文件实例: class CifarRead(object): ''' 完成读取二进制文件,写进tfrecords,读取tfrecords :param obj ...
- stylus使用文档总结:选择器+变量+插值+运算符+混合书写+方法
建立好项目后我们来安装stylus npm install stylus stylus-loader --save-dev 这样就安装上了stylus. 接下来就可以使用了,使用方式分两种.一种是在. ...
- Linux C高级编程——文件操作之系统调用
Linux C高级编程文件操作之系统调用 宗旨:技术的学习是有限的,分享的精神是无限的. 库函数是一些完毕特定功能的函数.一般由某个标准组织制作公布,并形成一定的标准.使用库函数编 ...
- Python 爬取汽车领域问答语料(自用)
#coding=utf-8 import time import requests from lxml import etree from pymongo import MongoClient fro ...
- Android-ImageView的属性android:scaleType作用
在网上查了好多资料,大致都雷同,大家都是互相抄袭的,看着很费劲,不好理解,自己总结一下,留着需要看的话来查找. 代码中的例子如下: <ImageView android:id="@+i ...
- Redis中为什么使用跳表---------转自http://blog.csdn.net/u010412301/article/details/64923131
最近在研究数据库的一些底层实现,百度的面试官问到了跳表,当时没有回答上来,在csdn上看到了这篇文章,感觉写的比较好,希望大家可以多多交流. Redis里面使用skiplist是为了实现sorted ...
- Python描写叙述符(descriptor)解密
Python中包括了很多内建的语言特性,它们使得代码简洁且易于理解.这些特性包括列表/集合/字典推导式,属性(property).以及装饰器(decorator).对于大部分特性来说,这些" ...
- eslint for...in 报错处理
示例代码: <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF ...