定义类型的正确方式(typedef与#define)
Proper way to define type (typedef vs #define)
以下哪种方法对定义变量类型更安全?我知道当我们看到#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
就"更安全"。
相关文章:
- C++:TypeDef使用元组
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 为什么在使用typedef时类推导指南会失败
- 与C代码相比,为什么C++代码不需要"#define _POSIX_C_SOURCE 200809L"?
- 以下 C++ 代码用于 -> "#define idiv(a, b) (((a) + (b) / 2) / (b))" 是什么?
- 尝试根据类中 typedef 的存在来专门化模板函数
- 如何重新定义MPI_FLOAT,MPI_DOUBLE以 typedef 的方式
- typedef 枚举和枚举类有什么区别?
- 如何以静态代码分析友好的方式使用 #define 防护?
- 在类模板中使用 typedef 时出错
- C++相当于整数的 #define
- 模板类中的 typedef 语句
- #define Dbg(fmt,..) (0) 是什么意思? 警告:表达式无效
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 使用#Define和Typedef与数据类型A一起使用
- 定义类型的正确方式(typedef与#define)
- 带有外部 #define 和 typedef 结构的静态库
- 使用typedef和 #define 进行不同的原型设计
- 在define宏中使用typedef定义函数