zoukankan      html  css  js  c++  java
  • typedef与#define的区别

    typedef与#define

    1.先来看看下面的两段代码有什么区别(注意每一段的第1行代码)

    * 第1段

    复制代码
    1 typedef char *String;
    2 
    3 int main(int argc, const char * argv[]) {
    4     String str = "This is a string!";
    5     return 0;
    6 }
    复制代码

    * 第2段

    复制代码
    1 #define String char *
    2 
    3 int main(int argc, const char * argv[]) {
    4     String str = "This is a string!";
    5     return 0;
    6 }
    复制代码

    上面的两段代码只是第1行代码不一样,运行的效果都是一样的:定义了一个字符串"This is a string!"。

    但它们的实现方式是不一样的:

    • 第1段代码是用typedef给char *定义别名为String
    • 第2段代码是用char *代替代码中的宏名String

    只看上面两段代码,似乎看不太出typedef和#define的区别。

    2.再来看一段代码

    复制代码
     1 typedef char *String1;
     2 
     3 #define String2 char *
     4 
     5 int main(int argc, const char * argv[]) {
     6     String1 str1, str2;
     7     
     8     String2 str3, str4;
     9     return 0;
    10 }
    复制代码

    第1行给char *起了个别名String1,第2行定义了宏String2。然后在第6、第8行定义了4个变量。

    重点来了,注意:在这种情况下,只有str1、str2、str3才是指向char类型的指针变量,str4只是个char类型的变量。

    下面简单分析一下原因:

    * 如果连续声明两个int类型的变量,我们可以这样写:

    int a, b;

    上面的代码相当于:

    int a;
    int b;

    * 以此类推

    1 typedef char *String1;
    2     
    3 String1 str1, str2;

    经过typedef处理后,String1也算是一种数据类型,所以第3行代码相当于

    1 String1 str1;
    2 String1 str2;

    由于String1就是char *,所以上面的两行代码等于

    char *str1;
    char *str2;

    * 再看看宏定义的情况

    1 #define String2 char *
    2 
    3 String2 str3, str4;

    因为宏定义纯粹是字符串替换,用char *代替String2,所以第3行代码相当于

    char * str3, str4;

    其实也就相当于:

    char * str3;
    char str4;

    可以看出,只有str4是基本数据类型,str1、str2、str3都是指针类型。

    所以,以后给类型起别名,最好使用typedef,而不是使用#define。

    总结:#define宏定义纯粹是字符串替换,而typede是给类型起别名,和原类型功能一样。

  • 相关阅读:
    hdu 1863
    数据结构与算法分析–Minimum Spanning Tree(最小生成树)
    hdu 1856 More is better
    hdu 1272 小希的迷宫
    数据结构与算法分析 – Disjoint Set(并查集)
    数字逻辑电路课程设计报告
    高校成绩管理数据库系统的设计与实现
    PL/0编译器(java version) – SymbolTable.java
    [jquery]添加行内容后根据下拉菜单选择内容对比之前已有选项,若有重置再提示
    bootstrap-datetimepicker 日期控件的开始日期
  • 原文地址:https://www.cnblogs.com/stevenwuzheng/p/5511139.html
Copyright © 2011-2022 走看看