对于定义变量类型,哪种方法更安全?我知道当我们看到#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;
}
答案 0 :(得分:10)
尽量不要在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)");
是“更安全”。