为什么使用C typedef而不是#defines?

时间:2010-04-07 10:46:32

标签: c standards

在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}}不会发生这种情况,但在我看来,这似乎没有任何特别的优势或坏处;我无法想到如果出现问题,使用不会导致构建错误的情况。

5 个答案:

答案 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)

  • 如果编译器/调试器知道类型,则调试器和编译器错误消息会变得更有用。 (这也是你应该使用常量而不是在可能的地方定义的原因)
  • 阵列,正如其他人所示
  • 您可以将typedef限制为较小的范围(例如,函数)。在C ++中更是如此。
相关问题