typedef和#define在c中是一样的吗?

我不知道typedef#define在c中是一样的吗?

9 Solutions collect form web for “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; 

在这种情况下, abtypes都是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定义。

  • 内buildtypes的析构函数(int,char等)
  • C ++中“struct”和“typedef struct”的区别?
  • 我可以模仿一个C头重新定义C ++的布尔?
  • typedef指针是个好主意吗?
  • typedef固定长度数组
  • 如何使用C ++ 11 using语法typedef函数指针?
  • 在C#中的typedef等效
  • 理解C中函数指针的typedef
  • 是typedef之间的types和别名符合标准?
  • 为什么我需要在g ++中使用typedef typename而不是VS?
  • 自引用结构体定义?