#define文件类型

时间:2010-10-07 09:01:48

标签: c++ c-preprocessor

#define LBitmap std::list < CBITMAP *>

一个好习惯?

编辑: 好吧,我该怎么做才能说服我的老板这是不好的做法?

5 个答案:

答案 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;