• 3074阅读
  • 1回复

Question1.13:What's the difference between using a typedef or a #define for a user-defined type? [复制链接]

上一主题 下一主题
离线那个谁
 

只看楼主 倒序阅读 使用道具 楼主  发表于: 2013-07-13
— 本帖被 tyrone2497谁 执行加亮操作(2013-07-19) —
Q: What's the difference between using a typedef or a #define for a user-defined type?
A: In general, typedefs are preferred, in part because they can correctly encode pointer types. For example, consider these declarations:
                 typedef char *String_t;
                  #define String_d char *
                  String_t s1, s2;
                  String_d s3, s4;
s1, s2, and s3 are all declared as char *, but s4 is declared as a char, which is probably not the intention. (See also question 1.5.)
#defines do have the advantage that #ifdef works on them (see also question 10.15). On the other hand, typedefs have the advantage that they obey scope rules (that is,they can be declared local to a function or block).
See also questions 1.17, 2.22, 11.11, and 15.11.
离线那个谁

只看该作者 沙发  发表于: 2013-07-13
问题:用typedef和#define作为用户定义类型的时候有什么区别?
回答:通常,用typedefs更好一点,部分原因就是它能够正确的编码指针类型。例如:
          typedef char *String_t;
                  #define String_d char *
                  String_t s1, s2;
                  String_d s3, s4;
s1、s2和s3都别声明为char *类型,但是s4仅仅只是一个char类型的,而这并不是我的意图(参考问题1.5)。
(注意:#define是预编译时起作用的,即字符替换。所以这里的String_d s3, s4;为char * s3,s4。所以这就与我在问题1.5中描述的情况是一样的了,这也是为什么s4是char型的原因了。typedef则是在编译的时候起作用的,它不仅仅是做字符替换这么简单,而是对变量的一种声明的方式。所以这里的s1跟s2都是char *类型的。)
#define有一个优势就是#ifdef作用于它的时候(参考问题10.15)。另一方面,typedef有一个优势就是它遵循作用域的规则(也就是说它可以在一个函数或者块内声明局部变量)。
注意:关于它们的作用域是有区别的。#define则跟函数是没有关系的,它是从定义开始直到文件结尾。那么作用域则是不会随函数的结束而结束。而typedef则不同,如果是在函数的外面,那么作用于则是从定义开始直到文件尾部。如果是在函数内部,则是从定义开始到函数结束的时候,那么它也会随函数的结束而结束。这也是typedef的作用的优势。)
快速回复
限100 字节
如果您在写长篇帖子又不马上发表,建议存为草稿
 
上一个 下一个