3

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

typedef 和 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)

提前致谢!

4

3 回答 3

3

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

#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中的声明说明符指定,并且 D 中的标识符具有类型“派生声明符类型列表”,其中派生声明符类型列表由的声明者。TTTD

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

于 2013-03-01T15:54:26.470 回答
1

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

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

unsigned int i = 10;
于 2013-03-01T15:54:04.373 回答
1

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

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

于 2013-03-01T15:54:17.553 回答