zoukankan      html  css  js  c++  java
  • typedef可以成为你的朋友

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

    A:err

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

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

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

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

    ptr是指向int的指针类型;

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

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

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

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

    #include<stdio.h>
    
    int main(void)
    {
        int typedef a;
        a b=5;
        printf("%d
    ",b);
        return 0;
    }

    也不要把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=0;
        str++;// 正确底层const,常量指针,该指针指向的对象是常量,但指针自身可以改变
        const test string=0;
        string++;//错误,typedef出的是类型别名 char *,此时加const修饰为指针常量,即该指针是常量。
        return 0;
    }

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

  • 相关阅读:
    Android中实现ListView圆角效果[转]
    移动终端开发必备知识【转】
    android-supporting-multiple-devices
    Android @+id与@id的区别
    loading android
    Loading Image
    合理的薪酬策略——揭秘万达电商(3)
    Node.js的helloworld 程序
    codeforces Gravity Flip 题解
    HDU 3853 向下向右找出口问题-期望dp
  • 原文地址:https://www.cnblogs.com/yangguang-it/p/6926018.html
Copyright © 2011-2022 走看看