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可以成为你的朋友的更多相关文章

  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. C/C++ 语言中的表达式求值

    在此,首先向裘老师致敬! 裘宗燕:C/C++ 语言中的表达式求值 经常可以在一些讨论组里看到下面的提问:“谁知道下面C语句给n赋什么值?” m = 1; n = m+++m++; 最近有位不相识的朋友 ...

  2. 较详细的介绍JNI

    JNI其实是Java Native Interface的简称,也就是java本地接口.它提供了若干的API实现了和Java和其他语言的通信(主要是C&C++).也许不少人觉得Java已经足够强 ...

  3. SqlServer数据库1433端口问题1

    在本地使用telnet ip  1433 命令测试数据库1433端口是否打开,总是提示错误,根据网上查找资料总结了如下两点思路供参考,欢迎指正! (1)第一种情况可能是"Telnet客户端& ...

  4. Oracle imp关于fromuser 和 touser的用法

    fromuser就是把当前的dmp文件中的某一个用户下的数据取出.touser就是把现在dmp文件中的数据导入到目标库的指定user下.具体命令这样.exp userid=system/manager ...

  5. SpringMVC防止XSS注入

    xss(Cross Site Scripting)注入就是,跨站脚本攻击,和sql注入类似的,在请求中添加恶意脚本,实现控制用户. XssHttpServletRequestWrappe.java 重 ...

  6. Spark Streaming源码解读之流数据不断接收和全生命周期彻底研究和思考

    本节的主要内容: 一.数据接受架构和设计模式 二.接受数据的源码解读 Spark Streaming不断持续的接收数据,具有Receiver的Spark 应用程序的考虑. Receiver和Drive ...

  7. [HTML5] Add an SVG Image to a Webpage and Get a Reference to the Internal Elements in JavaScript

    We want to show an SVG avatar of the patio11bot, so we'll do that in three ways: Using an img tag - ...

  8. [Functional Programming Monad] Apply Stateful Computations To Functions (.ap, .liftA2)

    When building our stateful computations, there will come a time when we’ll need to combine two or mo ...

  9. leetcode 题解 || Letter Combinations of a Phone Number 问题

    problem: Given a digit string, return all possible letter combinations that the number could represe ...

  10. 详解php的魔术方法__get()和__set()

    先看看php官方文档的解释:__set() is run when writing data to inaccessible properties.__get() is utilized for re ...