讲下c语言中的宏
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了讲下c语言中的宏相关的知识,希望对你有一定的参考价值。
我在大学的C++教材上没学过这种宏的使用,请解释下下面的代码是什么意思?
#define DECLARE_DYNAMIC(class_name)
protected:
static CRuntimeClass* PASCAL _GetBaseClass();
public:
static const AFX_DATA CRuntimeClass
class##class_name;
virtual CRuntimeClass* GetRuntimeClass() const;
#define _DECLARE_DYNAMIC(class_name)
protected:
static CRuntimeClass* PASCAL _GetBaseClass();
public:
static AFX_DATA CRuntimeClass class##class_name;
virtual CRuntimeClass* GetRuntimeClass() const;
#else
#define DECLARE_DYNAMIC(class_name)
public:
static const AFX_DATA CRuntimeClass class##class_name;
virtual CRuntimeClass* GetRuntimeClass() const;
#define _DECLARE_DYNAMIC(class_name)
public:
static AFX_DATA CRuntimeClass class##class_name;
virtual CRuntimeClass* GetRuntimeClass() const;
#endif
反斜杠 表示下面的行应当和本行在同一行。
宏 [#define 这串字符串 一大堆东西]
作用是以后遇到 这串字符串 就替换为 一大堆东西。
#define DECLARE_DYNAMIC(class_name) 反斜杠一大堆东西
因为有(class_name),叫 变参宏,
这串字符串 是 DECLARE_DYNAMIC(变参),替换作业时,一大堆东西里的 class_name 也要用 实参 代替。
#ifdef _AFXDLL
#define DECLARE_DYNAMIC(class_name) 反斜杠一大堆东西
#else
#define DECLARE_DYNAMIC(class_name) 反斜杠 另外一大堆东西
#endif
如果定义了 _AFXDLL,则 这串字符串 用 一大堆东西 替换,class_name 也用实参替换
否则,这串字符串 用 另一大堆东西 替换,class_name 也用实参替换
## 表示 前后两 token 连接
读一下参考资料,了解 # 和 ## 应用,如何做宏替代。
参考资料:http://www.kuqin.com/language/20080721/11906.html
参考技术A 这应该是MFC类库的一段声明。主要关于运行时识别的东西。要解释清楚你这里的东西篇幅实在太多了。我挑几个给你距离说明好了。
第一句的DECLARE_DYNAMIC宏:
#define DECLARE_DYNAMIC(CLASS)
.
.
.
#endif
以上都是这个宏的定义。如果以后你在文件中写DECKARE_DYNAMIC(CView).那么这个宏就会自动帮你完成CView的声明工作。
宏里面“##”符号的意思是连接两个字符串 执行完毕之后生成的类名是classCView.
在你这个宏之前应该还少了一句#ifndef XXX。这样这个宏才能完整
整个的意思是:
if(没有定义XXX)
那么就定义DECLARE_DYNAMIC
else
否则就定义_DECLARE_DYNAMIC
宏只是简单的替换而已。如果想要深入了解MFC。可以看看侯捷老师的《深入浅出MFC》.不过看你的代码,很像那本书上的一段代码。微软的MFC用了太多的宏,确实不好理解。但是请坚持下去,一段时间后你会发现 ---- “不过如此” 参考技术B 要掌握下面几个:
……
#
##
一些设计的细节,防止产生bug
具体参考酷勤:
www.kuqin.com/language/20080721/11906.html本回答被提问者采纳
以上是关于讲下c语言中的宏的主要内容,如果未能解决你的问题,请参考以下文章