typedef static char int8;这个声明正确吗?

A:err

所以上面那个声明是错误的。

typedef为一种类型引入新的名字,而不是为变量分配空间,它并没有引入新的类型,而是为现有的类型取个新名字。在说到typedef时,有一个很好的例子是signal()函数声明,但是,一般而言只有极少数情况才会使用到这样的技巧,这里就不再赘述,我们应该知道更多关于typedef对于大多数程序员应该知道的事。

说到typedef就不能不说一下它的缺点。它同样具有与其他声明一样的混乱语法。可以把几个声明器塞到一个声明中去,例如:

  1. typedef int *ptr,(*fun)(void),arr[];

ptr是指向int的指针类型;

fun是指向返回值为int的参数为void的函数的指针类型;

arr是长度为5的int型数组类型。

上面这样的写法应该尽量避免使用。

甚至typedef的位置不是必须放在声明的开始部分,例如:

  1. #include<stdio.h>
  2.  
  3. int main(void)
  4. {
  5. int typedef a;
  6. a b=;
  7. printf("%d\n",b);
  8. return ;
  9. }

也不要把typedef嵌入到声明的中间部分,如下所示:

  1. 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是一种彻底的“封装”,在声明它之后不能再往里面增加别的东西,这和宏不同。

  1. #define peach int
  2. unsigned peach i;//right
  3. typedef int banana;
  4. 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的时候,应该尽量避免混淆,做到思路清晰,代码可读性高。

再看一例:

  1. #include<stdio.h>
  2. typedef char * test;
  3. int main(void)
  4. {
  5. const char * str=;
  6. str++;// 正确底层const,常量指针,该指针指向的对象是常量,但指针自身可以改变
  7. const test string=;
  8. string++;//错误,typedef出的是类型别名 char *,此时加const修饰为指针常量,即该指针是常量。
  9. return ;
  10. }

前面说了,不要在使用了typedef的标识符前后再加修饰(上面例子在typedef声明的别名test前又加了一个const修饰),那样有可能和你想的不同。知道可能的坑,并善于利用typedef带给我们的便利,typedef可以成为你的朋友。

typedef可以成为你的朋友的更多相关文章

  1. C语言学习书籍推荐《C专家编程Expert C Programming Deep C Secrets》下载

    Peter Van Der Linden (作者) <C和C++经典著作 C专家编程Expert C Programming Deep C Secrets>展示了C程序员所使用的编码技巧, ...

  2. 19-typedef

    本文目录 一.typedef作用简介 二.typedef与指针 三.typedef与结构体 三.typedef与指向结构体的指针 四.typedef与枚举类型 五.typedef与指向函数的指针 六. ...

  3. #define与typedef在重定义类型中的区别

    #define 为完全的替换 typedef 重新定一个数据类型 eg #define charp1 char* typedef char* charp2charp1 a,b; //a char* b ...

  4. typedef

    第一.四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换.可以用作同时声明指针型的多个对象.比如:char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, ...

  5. 用typedef定义函数指针的问题

    在学习windows API的时候,遇到下面这段代码   以前见过的typedef的用法都是给一个数据类型取一个别名 typedef oldTypeName newTypeName   这种给数据类型 ...

  6. C语言语法 typedef小结

    在总结typedef之前,先了解一个专业术语: 常量指针(const pointer):常量指针在定义的时候必须被初始化,而且一旦初始化完成,则它的值就不能再改变. int errNumb = 0; ...

  7. 如何理解typedef void (*pfun)(void)

    问题: 在刚接触typedef void (*pfun)(void) 这个结构的时候,存在疑惑,为什么typedef后只有一"块"东西,而不是两"块"东西呢?那 ...

  8. C及C++中typedef的简单使用指南

    又是在学数据结构的时候,发现了之前学习的知识遗忘很多,在发现对C/C++中关键字typedef的理解还是没有到位后,我翻阅了学C++用到的课本,又问了度娘,也看了不少关于typedef用法的博客.于是 ...

  9. [转]关于typedef的用法总结

    不管实在C还是C++代码中,typedef这个词都不少见,当然出现频率较高的还是在C代码中.typedef与#define有些相似,但更多的是不同,特别是在一些复杂的用法上,就完全不同了,看了网上一些 ...

随机推荐

  1. if __name__=='__main__"在有的virtualenvs环境下执行成功,在有的环境下执行失败?

    我的项目是erebus,所以默认的python解释器位于virtualenvs下的erebus,但是这个执行环境执行某个py文件总是失败,换其他的执行器执行反而没有问题: 排查了半天,才发现erebu ...

  2. shader 变体variants

    https://blogs.unity3d.com/cn/2018/05/14/stripping-scriptable-shader-variants/ variants涉及的是build时间和da ...

  3. scrapy 抓取数据被禁止的解决方法

    在用抓取头条新闻的数据时出现以下问题:禁止抓取,结果数据没有出来 后来经过查询得知需要把settings.py里面 修改为ROBOTSTXT_OBEY = False就可以了, 默认True

  4. Hadoop平台配置汇总

    Hadoop平台配置汇总 @(Hadoop) Hadoop hadoop-env.sh和yarn-env.sh中export log和pid的dir即可和JAVA_HOME. core-site.xm ...

  5. Spring框架学习(6)使用ioc注解方式配置bean

    内容源自:使用ioc注解方式配置bean context层 : 上下文环境/容器环境 applicationContext.xml 1 ioc注解功能 注解 简化xml文件配置 如 hibernate ...

  6. CocoSourcesCS 3

    CocoSourcesCS 3 /*---------------------------------------------------------------------- Compiler Ge ...

  7. aspcms 幻灯片用列表调用

    首先找到网站目录/inc/AspCms_MainClass.asp 增加主函数 Public Function parseSlideList(str) if not isExistStr(conten ...

  8. Mach-O文件格式和程序从载入到运行过程

    > 之前深入了解过.过去了一年多的时间.如今花些时间好好总结下,毕竟好记性不如烂笔头. 其次另一个目的,对于mach-o文件结构.关于动态载入信息那个数据区中,命令含义没有深刻掰扯清除,希望有同 ...

  9. gcc编译选项汇集

    gcc -g 调试选项(DEBUGGING OPTION)GNU CC拥有许多特别选项,既可以调试用户的程序,也可以对GCC排错: -g 以操作系统的本地格式(stabs, COFF, XCOFF,或 ...

  10. thinkphp 表名 大小写 窍门

    我们有一个表auth_group_access,那么如何使用呢?在使用M方法时,对于带下划线的表名,可以采用如下方法. M('AuthGroupAccess');对应sql语句SQL: SHOW CO ...