C++ 定义类型的正确方法(typedef与#define)

C++ 定义类型的正确方法(typedef与#define),c++,c++11,c++14,C++,C++11,C++14,以下哪种方法对于定义变量类型更安全?我知道当我们看到#defines时,我们都会皱眉,但它似乎和这里的typedef一样有效: 有这样或那样的优势吗?如果有,可能是什么 方法一: #include <iostream> #define byte unsigned char int main() { byte testByte = 'A'; std::cout << testByte << std::e

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

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

方法一:

    #include <iostream>

    #define byte unsigned char

    int main() {
        byte testByte = 'A';
        std::cout << testByte << std::endl;

        return 0;
    }
#包括
#定义字节无符号字符
int main(){
字节testByte='A';

std::cout您应该始终使用第二个(即or)

<>尽量不要在C++中使用宏,大多数情况都可以避免。它们只是编译前的文本替换,更“危险”。例如

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

还有新的“使用”语法


请参阅相关问题的答案(typedef与using)使用
typedef
。原因有很多,但首先想到的是
typedef
适用于声明它的作用域,而
#define
忽略作用域,并应用于它在其中定义的任何源模块的其余部分。仅出于这个原因,
typedef
就是这样“更安全”。

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


这只会在编译开始之前,将代码中所有
字节
语句替换为
无符号字符
。它不定义类型

声明
int byte;
将变成
int unsigned char;
,这是无意义的


这定义了一个类型。该类型将受语法规则、范围规则和所有这些可爱的东西的约束

声明
int-byte;
仍将是声明
int-byte;
,因为这里的
byte
位于变量名的空格中


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


引入它是因为,否则模板类型别名的新语法几乎不可能使其正常。

什么“更安全?”"意思是?你的方法1是可怕的实践。尽可能选择实际的语言功能而不是预处理器功能。换句话说,避免使用宏。#define是危险的,因为它会在编译之前搜索并替换代码中的类似操作。错误的东西可能会被替换。太好了!谢谢你的回答。我还应该提到,你如果使用
或typedef声明使用这些
定义一个单独的标题,它不仅可以将所有内容都限定到单个文件中,而且还允许您在一个且仅在一个位置更改值。
     #include <iostream>

     int main() {
        typedef unsigned char byte;

        byte testByte = 'A';
        std::cout << testByte << std::endl;

        return 0;
    }
#define byte_pointer unsigned char*
byte_pointer p, q; // only p is a pointer
using MyByte = unsigned char;
#define byte unsigned char
typedef unsigned char byte;
using byte = unsigned char;