2010-07-23 73 views
2

任何人都可以解释的typedef,#定义

#define int* char 

的区别
typedef int* char; 
+4

可能你的意思是'#define char int *' – Curd 2010-07-23 08:31:06

+3

已经有许多重复的东西,例如[是typedef和#define在c中是一样的吗?](http://stackoverflow.com/questions/1666353/is-typedef-and-define-the-same-in-c) - 可能是一个作业问题? – 2010-07-23 08:40:38

+2

也检查这一个 - http://stackoverflow.com/questions/3263252/is-typedef-just-a-string-replacement-in-code-or-somethings-else – KedarX 2010-07-23 08:52:16

回答

2

它们是不同的。检查这个SO question

#define是更换在预处理

的typedef用于定义一个新的类型,是预处理

2

定义是由预处理器(实际的C编译器前的程序运行),它的工作原理是取代所有的处理你编辑。

Typedef由c编译器本身处理,并且是新类型的实际定义。

0

[typdef]允许您引入可能已经用其他方式声明的类型的同义词。如本例所示,新名称与您想要的类型相同。

definec preprocessor macro,它只会取代您的代码中的出现。

但是,您展示的特定示例对我来说似乎有点不可思议。也许你可以在你的问题中添加一些背景信息。

1

#define是一个预处理指令。在编译之前,文本int*将更改为char。这是你通常不会做的事情。

Typedef是一种语言指令。它定义了一个新类型,如刚才所说的Forlan07

你的例子在任何一种形式中都很糟糕。幸运的是,这是非法的,因为GMan指出。

5

有没有区别,因为两者都是非法的过程中忽略了过程中进行处理。

int*不是一个宏的有效标识符,即使您放入一个空格,也不是int,因为它是关键字并且是保留的。即使您将其切换到您可能预期的#define char int*,也会出于同样原因失败。

而且你不能重新定义类型char,所以typedef是胸围。


的区别,你已经考虑到了法律的例子,是#define是一个预处理指令。它只是在编译阶段之前进行文本替换。相反,typedef定义了一个新类型,并且该新类型标识符像其他类型一样遵守“规则”。

0

typedef将替代名称分配给现有类型。即g: typedef unsigned long size_t

现在在代码中,你可以用unsigned long long替换size_t unsigned long temp;与size_t temp相同;

'#define'是一个预处理指令。它使得编译器遍历源代码,用替换字符串 (例如)替换每个出现的宏名称。 #define PI 3.14159

您选择的示例会导致编译错误。

0

使用宏而不是typedef定义的类型别名具有未定义或重新定义的灵活性,而typedef不具有这种灵活性。这就是为什么你可能会看到以这种方式定义的类型别名。这既是一种弱点,也是一种优势。使用常见名称(例如UINT,DWORD或BOOL)定义其自己类型的C库数量无数,并且在使用多个第三方库时会引发许多问题。至少使用宏可以强制它们未定义,或检查现有的定义;如果使用了typedef,那么您可能会遇到符号冲突问题,从而难以集成此类代码。

在C++中,通过将第三方代码封装在名称空间中可以更好地解决问题,然后typedef仍然是输入别名的更好解决方案。