是
#define LBitmap std::list < CBITMAP *>
一个好习惯?
编辑: 好吧,我该怎么做才能说服我的老板这是不好的做法?
答案 0 :(得分:13)
不,在C ++中使用#define不是一个好习惯。
使用typedef很好,因为它具有明确定义的范围
typedef是范围定义的,并且编译器在每次遇到时解释其定义,而不是#define。 #define本身被解释为编译时。
这是typedef和#define
的MSDN定义typedef声明引入一个名称,该名称在其范围内成为声明的类型声明部分给出的类型的同义词
使用DEFINE语句时,在预处理阶段,该语句的所有实例都将替换为语句的值。
#define LBitmap std::list < CBITMAP *> // BAD
typedef std::list < CBITMAP *> LBitmap // GOOD
说服你的老板
#define CHARPTR char*
CHARPTR a, b
;
预处理后,该行会扩展为
char* a, b;
这里,只有变量a的类型为char *,而b只是char
如果您使用typedef
typedef char* CHARPTR;
CHARPTR a, b;
这里a和b都是char *
类型答案 1 :(得分:9)
不,在C ++中不鼓励使用预处理器宏(#define
)。改为使用typedef
:
typedef std::list<CBITMAP *> LBitmap;
编辑:为了说服你的老板,你可以使用Pardeep发布的指针技巧,但是使用引用引入一个微妙的错误甚至更多 fun 具有指导意义:
#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;
}
答案 2 :(得分:3)
#define 只是一个文本替换,它可能会导致一些问题,导致您不打算拥有的代码。
typedef ,如果是为数据类型等提供别名的正确方法。
下面是#define失败的例子!
#define CHARPTR_DEFINE char*
typedef char* CHARPTR_TYPEDEF;
CHARPTR_DEFINE ptr1, ptr2; --> evaluates to char *ptr1, ptr2;
CHARPTR_TYPEDEF ptr3, ptr4; -->evaluates to char *ptr3,*ptr4;
答案 3 :(得分:2)
不,为了定义类型别名,有一个更好的设施:
typedef std::list< CBITMAP *> LBitmap;
#define
会导致文本替换,从而导致令人惊讶的结果。另一方面,typedef
为其他类型创建了一个合适的别名。
答案 4 :(得分:1)
没有。在这种情况下,最好使用typedef
:
typedef std::list<CBITMAP*> LBitmap;