#define文件类型

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*类型


Fre*_*Foo 9

不,#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)