C语言中的宏定义怎么用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中的宏定义怎么用?相关的知识,希望对你有一定的参考价值。

C语言中的宏定义用法分为两种。

1、不带参数的宏定义比较简单,就是用一个指定的标识符来代表一个字符串。它的一般形式为“#define 标识符 字符串”,例如#define E 2.718281828459。这种方法使用户能以一个简单的名字代替一个长的字符串。

2、带参数的宏定义不是仅仅进行简单的字符串替换,还要进行参数替换。其定义的一般形式为;“#define 标识符(宏名)(参数表) 字符串”,字符串中包含在括号中所指定的参数。例如#define S(a,b) a*b area=S(3. 2)。

扩展资料:

宏定义只占编译时间,函数调用则占用运行时间(分配单元,保存现场,值传递,返回),每次执行都要载入,所以执行相对宏定义会较慢。

使用宏定义次数多时,宏定义展开后源程序很长,因为每展开一次都使程序增长,但是执行起来比较快一点(这也不是绝对的,当有很多宏定义展开,目标文件很大,执行的时候运行时系统换页频繁,效率就会低下)。而函数调用不使源程序变长。

参考技术A

宏定义的格式如下:

#define  标识符  字符串

其中,#表示这是一条预处理命令;#define为宏定义命令;“标识符”为宏定义的宏名;“字符串”可以上常数、表达式、格式串等。


举例如下:

#define PI 3.14   // 对3.14进行宏定义,宏名为PI
void main()

    printf("%f", PI);   // 输出3.14

参考技术B 在想对特定的内容定义的时候用
参考网址 http://baike.baidu.com/view/2076445.htm

有问题请追问 满意记得采纳来自:求助得到的回答本回答被提问者采纳
参考技术B #define 宏名称 定值

讲下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

像 afx.h 文件。漏写了许多反斜杠。
反斜杠 表示下面的行应当和本行在同一行。

宏 [#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语言中的宏定义怎么用?的主要内容,如果未能解决你的问题,请参考以下文章

C语言中的宏定义如何使用?

C语言中的宏定义有啥用?

讲下c语言中的宏

c语言中的“宏”是指啥?

C语言的宏定义,字符串连接

C语言学习笔记--C语言中的宏定义