【问题标题】:Provide reason for below mentioned difference in behavior of typdef & #define提供下面提到的 typedef 和 #define 行为差异的原因
【发布时间】:2013-03-01 15:50:20
【问题描述】:

我已经浏览了现有的可用信息

difference between typedef and define & typedef,#define

所有回复都非常有用。 我刚刚又遇到了一个例子,谁能提供这种行为的原因。

对于声明 unsigned int 变量,这将起作用:

#define INTEGER int
unsigned INTEGER i = 10;

但是,在 typedef 的情况下它不起作用,

例如

typedef int INTEGER;
unsigned INTEGER i = 10;

它会抛出错误:'i' undeclared (first use in this function)

提前致谢!

【问题讨论】:

    标签: c macros typedef


    【解决方案1】:

    预处理器只是复制和粘贴。当你写:

    #define INTEGER int
    unsigned INTEGER i = 10;
    

    在编译器本身之前,预处理器将代码转入:

    unsigned int i = 10;
    

    但是,typedef 会被编译器处理。

    C11 (n1570),§ 6.7.8 类型定义

    typedef 声明没有引入新类型,只有一个 如此指定的类型的同义词。也就是说,在以下声明中:

    typedef T type_ident;
    type_ident D;
    

    type_ident 定义为 typedef 名称,其类型由声明指定 T 中的说明符(称为T),并且 D 中的标识符具有类型“派生声明符- type-list T '' 其中派生声明符类型列表由 D 的声明符指定。

    换句话说,<INTEGER><int> 的同义词。但是<unsigned INTEGER>被当作单一类型,不存在。

    【讨论】:

      【解决方案2】:

      typedef 为您在 typedef 声明中的确切类型创建类型别名。该类型被编译器识别为真正的类型。在您的情况下,将有一个正确的类型 INTEGER,但没有 unsigned INTEGER 类型,这就是错误的原因。

      一个宏 (#define) 甚至在编译器看到它之前就被预处理器替换了。所以对于编译器来说,第一种情况很简单

      unsigned int i = 10;
      

      【讨论】:

        【解决方案3】:

        原因是 typedef 不是 1:1 文字文本替换。基本上,在第一种情况下,unsigned INTEGER 扩展为 unsigned int,这是一个有效的类型名称(C 中只允许类型名称和限定符的某些组合,unsigned int 就是其中之一。)

        然而,在第二种情况下,unsigned INTEGER 不是类型名称的有效组合。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多