定义类型的正确方式(typedef与#define)

Proper way to define type (typedef vs #define)

本文关键字:typedef #define 方式 类型 定义      更新时间:2023-10-16

以下哪种方法对定义变量类型更安全?我知道当我们看到#defines时,我们都会皱眉头,但它似乎和typedef一样有效:

有这样或那样的优势吗?如果有,可能是什么?

方法一:

    #include <iostream>
    #define byte unsigned char
    int main() {
        byte testByte = 'A';
        std::cout << testByte << std::endl;
        return 0;
    }

方法二:

     #include <iostream>
     int main() {
        typedef unsigned char byte;
        byte testByte = 'A';
        std::cout << testByte << std::endl;
        return 0;
    }

您应该始终使用第二个(即typedef或using)。

尽量不要在c++中使用宏,大多数情况下都可以避免。它们只是编译前的文本替换,而且更"危险"。例如

#define byte_pointer unsigned char*
byte_pointer p, q; // only p is a pointer

实际上只有一个示例是定义类型的方法,因此它们之间没有竞争。


#define byte unsigned char

这只会使代码中byte的所有语句在编译开始前被unsigned char替换。它没有定义类型。

声明int byte;将变成int unsigned char;,这是无稽之谈。


typedef unsigned char byte;

这定义了一种类型。该类型将受到语法规则、作用域规则和所有这些可爱的东西的约束。

声明int byte;仍然是声明int byte;,因为此处的byte位于变量名的空格中。


using byte = unsigned char;

这是定义类型别名的"现代"方式,它的语法比typedef语句清晰得多(尤其是对于更复杂的类型)。

之所以引入它,是因为否则模板类型别名的新语法几乎不可能变得合理。

使用#define是不安全的(请参阅其他答案)使用typedef是定义类型别名的常用方法。

还有新的"使用"语法

using MyByte = unsigned char;

请参阅相关问题的答案(typedef与using)https://stackoverflow.com/a/10748056/446303

使用typedef。原因有很多,但首先想到的是typedef适用于声明它的作用域,但#define忽略了作用域,并适用于定义它的任何源模块的其余部分。仅凭这个原因,typedef就"更安全"。