为什么要使用C中的typedef而不是#define?

12

在 C 代码中,使用 typedef 替代 #define 有何优势(如果有的话)?

比如说,使用 typedef 是否有什么优点?

typedef unsigned char UBYTE

结束

#define UBYTE unsigned char

当两者都可以使用时

void func()
{
        UBYTE byte_value = 0;

        /* Do some stuff */

        return byte_value;
}

显然,预处理器会尝试在看到#define时扩展它,这在使用typedef时不会发生,但对我来说,这似乎没有任何特定的优势或劣势;如果存在问题,我想不出任何情况下使用任一种方式都不会导致构建错误。

5个回答

24

如果您对数组类型进行typedef,您将看到以下区别:

typedef unsigned char UCARY[3];
struct example { UCARY x, y, z; };

用#define这样做...不行,我们不要这样做。

[编辑]: 另一个优点是调试器通常知道typedefs但不知道#define。


10
预处理器说:“滥用我,滥用我...让我感觉被需要!!" +1 - Tim Post
我确实经常滥用预处理器,但除非没有其他方法,否则不会用于类型。在过去的20年中,我只需要一次使用它来编写跨平台64位整数处理代码。当时可用的编译器令人惊讶地棘手,最终导致了比我想象中更多的#ifdef。 - Donal Fellows
@missingno:如果没有typedef,使用函数类型非常困难,但一旦有了它,你不仅可以用它来声明一个函数,还可以声明指向该函数的指针(这些指针使用起来略微更难,但一旦使用typedef去除险象环生后,也就完全不再难用了……) - Donal Fellows

3

从C ++的角度来看,使用您的代码的C ++程序员可能会有以下内容:

template<typename T> class String
{
     typedef T char_type;
     // ...
};

现在,如果在您的C代码中,您写了以下内容:

#define char_type uint32_t // 因为我正在使用UTF-32

那么,您将会给您头文件的用户带来严重的麻烦。使用typedefs,您可以在不同的作用域内更改typedef的值...而#defines不遵守作用域。

我知道您已经将此标记为C,但C程序员和C ++程序员需要意识到他们的头文件可能会被彼此使用...这是要牢记的事情之一。


3

1) 可能最大的优点是代码更加清晰。通常滥用宏会使代码变得难以维护,被称为“宏汤”。

2) 使用typedef可以定义新类型。使用宏实际上是替换文本。当处理typedef错误时,编译器肯定更有帮助。


2

#define 只是在预处理期间进行字符串替换。而 typedef 则引入了一个新类型。这使得在代码中更容易发现潜在问题,如果有任何问题,编译器可能会提供更详细的信息。


1
不完全是一个“新”类型 - 它只是现有类型的别名 - 但它确实是一种类型,没错。 - philsquared

2
  • 如果编译器/调试器知道类型,调试器和编译器的错误信息将变得更加有用。(这也是为什么在可能的情况下应该使用常量而不是定义的原因)
  • 正如其他人所示,数组也可以做到这一点。
  • 您可以将typedef限制在较小的范围(例如函数)内。在C++中更为真实。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接