关于#define和typedef

付吉祥 2009-05-29 10:36

请见代码:

Code:
  1. #define  a int;
  2. unsigned a i;//right
  3. typedef int b;
  4. unsigned b i;//wrong

问下typedef和宏定义为什么会有这个区别?谢谢!

  • #1

    普罗通信西安有限公司 肖舸(C/C++老师) 2009-05-29 10:45

    #define是定义一个宏常量,编译前的预处理阶段,会把程序内所有的a,文本替换为int,不负责检查这种替换是不是对的。
    typedef,是为本次编译活动(能看见这条定义的所有cpp),定义个新的数据类型b,以后可以直接使用b这个类型来定义新的变量。这是编译期的事件,因为是明确的类型定义,编译器将为其做一定的合理性检查。
    如果写错了,编译器报出来的错误也不一样:
    #define a int
    typedef int b;
    void Funccc(void)
    {
            char* p=NULL;
            a aa=0;
            aa=p;
            b bb;
            bb=p;
    }

    1>d:/00xgwork/test_asm/test_asm/test_asm.cpp(15) : error C2440: “=”: 无法从“char *”转换为“int”(a 的错误)
    1>        没有使该转换得以执行的上下文
    1>d:/00xgwork/test_asm/test_asm/test_asm.cpp(17) : error C2440: “=”: 无法从“char *”转换为“b”(b的错误)
    1>        没有使该转换得以执行的上下文

  • #2

    韩卫平(C/C++老师) 2009-05-29 10:54

    宏只是预处理的时候替换掉.在编译的时候直接就是unsigned int i;
    typedef这个我还没找到相关的资料
  • #3

    付吉祥 2009-05-29 11:55

    谢谢两位老师~
  • #4

    胡柏华(C/C++老师) 2009-05-29 15:51

    #define 可以随意使用,反正编译器只做替换,唯一的限制是定义的内容里面不允许再出现#define或者#pragma或者#ifdef

    typedef是类型再定义,限制比较多:
    1、一个类型不允许被拆分,一定是个完整的定义
    2、不允许出现const修饰符
    3、不能与其它类型一起组合成新类型

    像你的例子,只能这样定义:
    typedef unsigned int b;
    b i;
    因为unsigned int是一个独立的类型,不能被拆分

  • #5

    韩卫平(C/C++老师) 2009-05-29 16:37

    胡柏华(C/C++老师): #define 可以随意使用,反正编译器只做替换,唯一的限制是定义的内容里面不允许再出现#define或者#pragma或者#ifdef

    typedef是类型再定义,限制比较多:
    1、一个类型不

    typedef是可以用 const的

    typedef const int Type;
    Type x = 199;
    这样就能编译过去
    类型组合也成,但不知道如何定义变量

    typedef int I;
    void func( unsigned I)
    {
    }
    这样也行,但就是写不上去参数。

  • #6

    胡柏华(C/C++老师) 2009-05-29 23:48

    unsigned I会被编译器识别为unsigned类型的变量I
  • #7

    韩卫平(C/C++老师) 2009-05-29 23:58

    胡柏华(C/C++老师)<img src='/image/teacher.gif' border='0'>: unsigned I会被编译器识别为unsigned类型的变量I

    这个我是在《The C++ Programming Language》中看到的写法。
    解释是f是一个没有名字的unsigned int为参数。
    在附录中提到了这个情况。
    也不清楚标准关于这点是怎么规定的

  • #8

    胡柏华(C/C++老师) 2009-05-31 14:07

    这是C语言中最恶心的地方,几乎所有编译器都不能百分百符合规范也就是这个原因,当存在二义性的时候,看编译器优先选择谁。有时连规范都没有考虑到。
    习惯良好的程序员通常都不会故意设计出具有二义性的代码,因为结果极可能就是苦了自己,累了别人。

关于#define和typedef相关推荐

  1. #define与typedef的区别!

    #define与typedef的区别! #define dPS struct s * typedef struct s * tPS; 以上两种情况的意图都是要定义 dPS 和 tPS 作为一个指向结构 ...

  2. 【转载】define与typedef区别与联系

    define与typedef区别与联系 1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正 确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错 ...

  3. #define 与 typedef

    1.#define:预编译指令,在预编译的时候,进行文本替换. 2.typedef:编译时处理,为类型取一个别名. 3.#define与typedef的顺序是相反的,记住typedef就行了.type ...

  4. #define、typedef与const

    #define.typedef与const #define(宏定义)只是简单的字符串代换(原地扩展),它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了. typedef是为了增加可读 ...

  5. C语言 #define 与 typedef 的区别

    C语言 #define 与 typedef 的区别与用法 (qq.com) 在C语言编程中,typedef 和 #define是最常用语句,可能很多工作过几年的工程师都没有去深究过它们的一些用法和区别 ...

  6. #define用法以及#define和typedef区别

    1.简单的define定义 #define MAXTIME 1000 2.define的"函数定义" define可以像函数那样接受一些参数,如下 #define max(x,y) ...

  7. #define const typedef

    #define用法 1. 定义简单的常数:定义常量,便于修改 #define N 1000 2. 定义简单的函数:注意多使用括号 define可以像函数那样接受一些参数,如下: #define max ...

  8. 《c专家编程》笔记--define和typedef的区别

    #include <stdio.h> #define peach int typedef int banana;int main(void){unsigned peach a;unsign ...

  9. 2014腾讯实习生笔试题——define与typedef

    2014腾讯实习生笔试(广州站)第26题填空题: #define MAX_NUM 1000+1 int Temp = Max_NUM*10; 则Temp的值为( ) 答案是:1010, 由于宏定义仅仅 ...

最新文章

  1. mysql 8.0数据备份恢复_第7章 备份和恢复
  2. html5 手机上传图片
  3. 需要在Emulator上模拟来电 效果
  4. 11.2.2 例题11-3 Buy or Build
  5. 终于收到微软的衬衫了!!!
  6. nodejs--http模块
  7. LeetCode 23 合并K个升序链表
  8. css实现web前端最美的loading加载动画!
  9. Ural 1519. Formula 1 优美的插头DP
  10. TCP/IP协议栈:TCP超时重传机制
  11. Python 2.x 即将终止支持,是时候和 Python 2 讲再见了
  12. Linux进阶之使用Oh-My-Zsh打造炫酷终端
  13. pcs7组态虚拟机中的服务器,PCS7冗余服务器配置
  14. 仪器采集信号后用matlab分析,基于MATLAB的语音信号采集和分析系统的可视化设计...
  15. Leetcode 781. 森林中的兔子 C++
  16. aix7.1重装6.1_优化AIX 6.1性能调整
  17. 我所经历的汶川大地震之二
  18. html圆角边框怎么做,CSS圆角边框制作指南与实例
  19. jQuery事件,对象以及插件
  20. python基础课程设计项目_Python+MySQL开发医院网上预约系统(课程设计)一

热门文章

  1. Nesting level too deep
  2. Java中实现精确的浮点数运算
  3. CNN全连接层怎么转化成一维向量?
  4. Javascript控制台打印Object对象
  5. 对接支付宝服务商当面付手机网页支付
  6. 7-1 查验身份证 (15 分)
  7. github 登陆不上怎么办?
  8. Linux相关命令总结
  9. 深度学习实战-从源码解密AlphGo Zero背后基本原理
  10. 优酷土豆资深工程师:MySQL高可用之MaxScale与MHA