类型定义,定义#

时间:2010-07-23 08:22:05

标签: c macros typedef

任何人都可以解释

之间的区别
#define int* char

typedef int* char;

7 个答案:

答案 0 :(得分:5)

没有区别,因为两者都是非法的。

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

您无法重新定义char类型,因此typedef是一个半身像。


如果您给出合法的示例,那么差异是#define是预处理指令。它只在编译阶段之前进行文本替换。相反,typedef定义了一种新类型,而新类型标识符就像任何其他类型一样尊重“规则”。

答案 1 :(得分:2)

定义由预处理器(在实际的c编译器之前运行的程序)处理,其工作方式类似于在编辑器中替换all。

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

答案 2 :(得分:2)

他们是不同的。检查此SO question

#define是替换,在预处理期间处理

typedef用于定义在预处理期间忽略的新类型

答案 3 :(得分:1)

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

Typedef是一种语言指令。它定义了一种新类型,如Forlan07所述。

你的例子在任何一种形式都非常糟糕。幸运的是,正如GMan指出的那样,这是非法的。

答案 4 :(得分:0)

  

[typdef]允许您为可能以其他方式声明的类型引入同义词。新名称将等同于您想要的类型,如此示例所示。

definec preprocessor macro,只会替换代码中的出现。

然而,你所展示的特定例子对我来说似乎有点奇怪。也许你可以在你的问题中添加一些背景信息。

答案 5 :(得分:0)

typedef为现有类型指定替代名称。例如: typedef unsigned long size_t

现在在代码中,您可以使用size_t替换unsigned long 无条件的长温;与size_t temp相同;

'#define'是一个预处理程序指令。它使编译器遍历源代码,用replacement-string替换每次出现的宏名称 例如#define PI 3.14159

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

答案 6 :(得分:0)

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

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