非议MFC(一)宏和类型定义的困惑
关键字:C++,MFC,宏,macro,define,typedef
有感于MFC库代码之去简就繁、之故弄玄虚,作下文,聊博一笑。
请看一段常见的代码:
//in user.h
class CTest
{
private:
int x;
public:
void SetX(int setX);
int GetX() const;
operator int *();
operator const int *() const;
void * GetSafeHandle() const;
};
//in user.cpp
#include "user.h"
void CTest::SetX(int setX)
{
x=setX;
}
//...
我们(MFC的作者)认为这样的代码太浅显,不够深沉,缺少内涵,没有嚼劲。赶快include我们的头文件吧,它可以提高代码的整体形象。我们的口号是:让蓝色关键字在屏幕上消失。
//in minimfc.h
#define USER_CLASS class
#define BEGIN_CLASS_DECLARATION {
#define END_CLASS_DECLARATION };
#define PRIVATE_MEMBER private:
#define PROTECTED_MEMBER protected:
#define PUBLIC_MEMBER public:
#define OPERATOR_OVERLOAD operator
#define CONSTANT_MEMBER_FUNTION const
#define BEGIN_FUNCTION_DEFINITION {
#define END_FUNCTION_DEFINITION }
typedef void AFX_RETURN_VOID_FUNCTION;
typedef int INT;
typedef int * LPINT;
typedef const int * LPCINT;
typedef void * HOBJ;
看!我们做到了。从此,我们的客户代码将这样写:
//in user.h
#include "minimfc.h"
USER_CLASS CTest
BEGIN_CLASS_DECLARATION
PRIVATE_MEMBER
INT x;
PUBLIC_MEMBER
AFX_RETURN_VOID_FUNCTION SetX(INT setX);
INT GetX() CONSTANT_MEMBER_FUNTION;
OPERATOR_OVERLOAD LPINT();
OPERATOR_OVERLOAD LPCINT() CONSTANT_MEMBER_FUNTION;
HOBJ GetSafeHandle() CONSTANT_MEMBER_FUNTION;
END_CLASS_DECLARATION
//in user.cpp
#include "user.h"
AFX_RETURN_VOID_FUNCTION CTest::SetX(INT setX)
BEGIN_FUNCTION_DEFINITION
x=setX;
END_FUNCTION_DEFINITION
//...