typedef和#define在c中是一样的吗?
我不知道typedef
和#define
在c中是一样的吗?
没有。
#define
是一个预处理器标记:编译器本身永远不会看到它。
typedef
是一个编译器令牌:预处理器不关心它。
您可以使用其中一种获得相同的效果,但最好使用适合您的需求
#define MY_TYPE int typedef int My_Type;
当事情变得“毛茸茸”的时候,使用适当的工具是正确的
#define FX_TYPE void (*)(int) typedef void (*stdfx)(int); void fx_typ(stdfx fx); /* ok */ void fx_def(FX_TYPE fx); /* error */
typedef
就像variables一样服从作用域规则,而define
保持有效直到文件结束(或者直到匹配的undef
)。
此外,有些事情可以通过typedef
来完成,而这些不能用define
来完成。
例子:
typedef int* int_p1; int_p1 a, b, c; // a, b, and c are all int pointers. #define int_p2 int* int_p2 a, b, c; // only the first is a pointer!
。
typedef int a10[10]; a10 a, b, c; // create three 10-int arrays
。
typedef int (*func_p) (int); func_p fp // func_p is a pointer to a function that // takes an int and returns an int
不,他们不一样。 例如:
#define INTPTR int* ... INTPTR a, b;
预处理后,该行扩展到
int* a, b;
希望你看到这个问题; 只有a
将有typesint *
; b
将被声明为纯int
(因为*
与声明符关联,而不是types说明符)。
与之相反
typedef int *INTPTR; ... INTPTR a, b;
在这种情况下, a
和b
types都是int *
。
有一些typedef类不能用预处理器macros来模拟,比如指向函数或数组的指针:
typedef int (*CALLBACK)(void); typedef int *(*(*OBNOXIOUSFUNC)(void))[20]; ... CALLBACK aCallbackFunc; // aCallbackFunc is a pointer to a function // returning int OBNOXIOUSFUNC anObnoxiousFunc; // anObnoxiousFunc is a pointer to a function // returning a pointer to a 20-element array // of pointers to int
试着用预处理macros来做这件事。
#define定义了macros。
typedef定义types。
现在说,这里有一些区别:
用#define你可以定义可以在编译时使用的常量。 常量可以和#ifdef一起用来检查代码是如何编译的,并根据编译参数来专门化某些代码。
您也可以使用#define声明微型查找和replacemacros函数 。
typedef可以用来为types提供别名(你也可以用#define来做),但是由于#define常量的查找和replace特性,它更安全。
除此之外,你可以使用typedef的 前向声明 ,它允许你声明一个将被使用的types,但是还没有链接到你正在编写的文件。
预处理macros(“#define's”)是“search和replace”的词汇replace工具。 他们完全不懂编程语言,不知道你在做什么。 你可以把它们想象成一个荣耀的复制/粘贴机制 – 偶尔有用,但你应该小心使用它。
Typedefs是一种C语言function,可让您为types创build别名。 这对于使复杂的复合types(如结构和函数指针)可读和可处理是非常有用的(在C ++中甚至有必须键入type的types)。
对于(3):在可能的情况下,您应该总是比预处理macros更喜欢语言function! 所以总是使用types的typedefs和常量的常量值。 这样,编译器实际上可以有效地与您进行交互。 请记住,编译器是你的朋友,所以你应该尽可能地告诉它。 通过隐藏编译器的语义,预处理器macros可以完全相反。
AFAIK,No.
'typedef'可以帮助你为现有的数据types设置一个“别名”。 例如。 typedef char chr;
#define是一个预处理器指令,用于定义macros或通用模式置换。 例如。 #define MAX 100,用100代替MAX的所有出现
没有。
typedef是为关键字创build别名的C关键字。
#define是一个预处理器指令,在编译之前创build一个文本replace事件。 当编译器到达代码时,原来的“#defined”字不再存在。 #define主要用于macros和全局常量。
他们是非常不同的,虽然他们经常被用来实现自定义数据types(这是我所假设的这个问题是所有关于)。
正如pmg所提到的,#define在编译器看到代码之前由预处理器(如剪切和粘贴操作)处理, typedef
由编译器解释。
主要的区别之一(至less在定义数据types时)是typedef
允许更具体的types检查。 例如,
#define defType int typedef int tdType defType x; tdType y;
在这里,编译器将variablesx看作是一个int,但将variablesy看作一个名为“tdType”的数据types,恰好与int相同。 如果你写了一个带有defTypetypes参数的函数,调用者可以传递一个正常的int值,编译器就不会知道这个差别。 如果该函数使用types为tdType的参数,编译器将确保在函数调用期间使用正确types的variables。
此外,一些debugging器有能力处理typedef
,比将所有自定义types列为其基本原始types(如果使用#define
代替它)更有用。
正如上面所有人所说,他们是不一样的。 大部分答案都表明typedef
比#define
更有优势。 但是让我加上#define
的加号:
当你的代码非常大,分散在许多文件中,最好使用#define
; 它有助于可读性 – 您可以简单地预处理所有代码,以在其声明本身的地方查看variables的实际types定义。