正确定义类型的方法(typedef vs #define)

时间:2016-04-09 14:22:39

标签: c++ c++11 c++14

对于定义变量类型,哪种方法更安全?我知道当我们看到#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;
    }

4 个答案:

答案 0 :(得分:10)

您应该始终使用第二个(即typedefusing)。

尽量不要在c ++中使用宏,大多数情况都可以避免。它们在编译之前只是文本替换,而且更“危险”。 e.g。

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

答案 1 :(得分:2)

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

byte

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

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

int byte;

这定义了一种类型。该类型将遵循语法规则,范围规则和所有可爱的东西。

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

typedef

这是定义类型别名的“现代”方式,它具有比{{1}}语句更清晰的语法(特别是对于更复杂的类型)。

引入它是因为否则模板类型别名的新语法几乎不可能理智。

答案 2 :(得分:1)

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

还有新的“使用”语法

sortTotal

查看相关问题的答案(typedef与使用)https://stackoverflow.com/a/10748056/446303

答案 3 :(得分:0)

使用typedef。有许多原因,但首先想到的是#define适用于声明它的范围,但typedef忽略范围并适用于任何源模块的其余部分。仅仅因为这个原因,myPanel.getElement().getStyle().setBackgroundImage("url(/myImage.jpg)"); 是“更安全”。