C++ 定义类型的正确方法(typedef与#define)
以下哪种方法对于定义变量类型更安全?我知道当我们看到#defines时,我们都会皱眉,但它似乎和这里的typedef一样有效: 有这样或那样的优势吗?如果有,可能是什么 方法一: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
#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;