Sve*_*ven 3 c++ c-preprocessor
是
#define LBitmap std::list < CBITMAP *>
Run Code Online (Sandbox Code Playgroud)
一个好习惯?
编辑:好吧,我该怎么做才能说服我的老板这是不好的做法?
Par*_*eep 13
不,在C++中使用#define并不是一个好习惯.
它很适合使用typedef,因为它具有明确定义的范围
typedef是范围定义的,并且编译器在每次遇到时解释其定义,而不是#define.#define被解释为编译时自身.
这是typedef和#define的MSDN定义
typedef声明引入一个名称,该名称在其范围内成为声明的类型声明部分给出的类型的同义词
使用DEFINE语句时,该语句的所有实例都将在预处理阶段由语句的值替换.
#define LBitmap std::list < CBITMAP *> // BAD
typedef std::list < CBITMAP *> LBitmap // GOOD
Run Code Online (Sandbox Code Playgroud)
说服你的老板
#define CHARPTR char*
Run Code Online (Sandbox Code Playgroud)
CHARPTR a, b;
在预处理之后,该行扩展为
char* a, b;
Run Code Online (Sandbox Code Playgroud)
这里,只有变量a的类型为char*,而b只是char
如果你使用typedef
typedef char* CHARPTR;
CHARPTR a, b;
Run Code Online (Sandbox Code Playgroud)
这里a和b都是char*类型
不,#define在C++中不鼓励使用预处理器宏().用一个typedef代替:
typedef std::list<CBITMAP *> LBitmap;
Run Code Online (Sandbox Code Playgroud)
编辑:为了说服你的老板,你可以使用Pardeep发布的指针技巧,但它更是如此 开玩笑 使用引用引入一个微妙的bug是有益的:
#define FooRef Foo &
struct Bar {
Foo a, b;
};
void func(Bar &bar)
{
FooRef a = bar.a, b = bar.b;
a = some_value;
b = another_value;
}
Run Code Online (Sandbox Code Playgroud)