在C代码中使用typedef
代替#define
有什么好处(如果有的话)?
举个例子,使用
有什么好处typedef unsigned char UBYTE
在
#define UBYTE unsigned char
两者都可以用作
void func()
{
UBYTE byte_value = 0;
/* Do some stuff */
return byte_value;
}
显然,预处理器会尝试在#define
处扩展typedef
,而{{1}}不会发生这种情况,但在我看来,这似乎没有任何特别的优势或坏处;我无法想到如果出现问题,使用不会导致构建错误的情况。
答案 0 :(得分:23)
如果你做一个数组类型的typedef,你会发现不同之处:
typedef unsigned char UCARY[3];
struct example { UCARY x, y, z; };
用#define来做...不,让我们不去那里。
[编辑]:另一个优点是调试器通常知道typedef但不知道#defines。
答案 1 :(得分:3)
好吧,从C ++角度来看,使用代码的C ++程序员可能会有类似的东西:
template<typename T> class String { typedef T char_type; // ... };
现在,如果在你的C代码中,你写了类似的东西:
#define char_type uint32_t // because I'm using UTF-32
好吧,您将为头文件的用户造成严重问题。使用typedef,您可以在不同的范围内更改typedef的值...而使用#defines不会考虑范围。
我知道你已经标记了这个C,但C程序员和C ++程序员需要意识到他们的标题可能会被彼此使用......这是要记住的事情之一。
答案 2 :(得分:2)
使用#define
,您只需在预处理期间进行字符串替换。 typedef
引入了一种新类型。这样可以更容易地在代码中找到可能的问题,并且在任何情况下编译器都可以为您提供更详细的信息。
答案 3 :(得分:2)
1)可能最大的优点是代码更清晰。 通常滥用宏会将代码转换为无法维护的混乱,称为“宏汤”。
2)通过使用typedef,您可以定义一个新类型。使用宏您实际上替换文本。在处理typedef错误时,编译器肯定会更有帮助。
答案 4 :(得分:2)