请问c++宏的高级运用有哪些

wyqstc1 2008-03-06 01:43:28
看了下书,感觉宏的应用和方法没撒差别,但是既然有了这个社定肯定有他的意义.所以请高手指教下具体的实际的运用.
...全文
315 12 打赏 收藏 举报
写回复
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
NKLoveRene 2008-03-06
  • 打赏
  • 举报
回复
觉得没用就不用了呗
这个也不是必须的
sheenl 2008-03-06
  • 打赏
  • 举报
回复
最高境界的用法, 手无无剑, 心中有剑。
明明c++支持宏, 但是你却不用, 就是最高境界
abupie 2008-03-06
  • 打赏
  • 举报
回复
宏定义又称为宏代换、宏替换,简称“宏”

格式:
#define 标识符 字符串

其中的标识符就是所谓的符号常量,也称为“宏名” , 预处理(预编译)工作也叫做宏展开:将宏名替换为字符串。
掌握"宏"概念的关键是“换”。一切以换为前提、做任何事情之前先要换,准确理解之前就要“换”。 即在对相关命令或语句的含义和功能作具体分析之前就要换,“不管三七二十一,先换了再说”。

常见的宏用途:
1 条件include
#ifndef MAIN_H_ 
#define MAIN_H_
其它内容
#endif

上面在看到头文件时会看到 作用就是阻止这个头文件被多次include
多次include就会出现重复的定义情况 所以需要在每个头文件中都使用这个定义
如果还不是很了解要怎样使用 可以看看 c的标准头文件 如fcntl.h

2 条件编译
#ifdef _DEBUG 
printf("this debug info\n");
#endif

如果没有定义_DEBUG宏的话 那么上面那一行是不会编译进去的
但是定义了_DEBUG后 上面那行就会编译进去 可以写个简单的程序测试

#include <stdio.h> 
int main()
{
#ifdef _DEBUG
printf("hello world\n");
#else
printf("no debug");
#endif
return 0;
}


第一次使用 gcc -D_DEBUG main.c
第二次使用 gcc main.c
运行两次的结果看

3 定义为某个值 以便后面修改这个值时不用修改其它地方代码 只要修改这个宏的定义就可以了
如一个软件的多语言版本等 如下
#include <stdio.h> 
#define PRINT_STR "你好 DD"
main(){
printf(PRINT_STR);
return 0;
}


编译时 会把PRINT_STR代替成"你好 DD" ,以后想修改时就方便了


4.定义为函数

#include <stdio.h>

#ifdef _DEBUG
#define A(x) a(x)
#else
#define A(x) b(x)
#endif

int a(int x)
{
return x+1;
}

int b(int x){
return x+100;
}

int main(){
printf ("A(10) value is %d",A(10));
return 0;
}


其实也可以定义成
#define A a

但是 定义成A(x)后 只有A后面带一个(x)类型的 编译器才会执行替换 比较安全 可以保证只替换函数而不替换变量

5.可变参数宏

有些时候定义一个宏来代替某个函数 但是这个函数是可变参数的话 那就需要考虑办法了 ,定义方法如下

#define PRINT(...) printf(__VA_ARGS__) 
#include <stdio.h>
int main(){
PRINT("%d %s %s",1,"吃饭了吗 smile MM:)","\n");
return 0;
}


6.宏组合
也就是## 和 #的用法
## 是连接符号 连接两个宏
#是把名字代替成字符串

#define s5(a) supper_ ## a 
#include <stdio.h>
void supper_printf(const char* p )
{
printf("this is supper printf:\n%s\n",a);
}

int main()
{
s5(printf)("hello owrld");
return 0;
}

//用法
#include <stdio.h>
#define s(p) #p
int main(){
printf(s(p)"\n");
return 0;
}
Treazy 2008-03-06
  • 打赏
  • 举报
回复
宏,双刃剑一把!
Chappell 2008-03-06
  • 打赏
  • 举报
回复
举个例子:
#define DECLARE_DYNAMIC(class_name) \
public: \
static CRuntimeClass class##class_name; \
virtual CRuntimeClass* GetRuntimeClass() const;
这是深入浅出MFC第三章的一个宏
假设你定义了一个类CMyClass,你希望把它申明为运行时刻类,于是你使用了上面的宏,如下:
class CMyClass{
CMyClass();
~CMyClass();

... ...

DECLARE_DYNAMIC(CMyClass)
};

它等同于如下代码:
class CMyClass{
CMyClass();
~CMyClass();

... ...

public:
static CRuntimeClass classCMyClass;
virtual CRuntimeClass* GetRuntimeClass() const;
};
  • 打赏
  • 举报
回复
这个宏还是尽量少用的好
redleaves 2008-03-06
  • 打赏
  • 举报
回复
把BOOST里那些用法都学会,你就BT了...
taodm 2008-03-06
  • 打赏
  • 举报
回复
去看<Effective C++>item1
dubiousway 2008-03-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 NKLoveRene 的回复:]
觉得没用就不用了呗
这个也不是必须的
[/Quote]

[Quote=引用 10 楼 uuussseeennn 的回复:]
看看MFC里是怎么用宏来实现RTTI,动态创建对象,消息映射机制的,你会对宏有一个新的认识。
[/Quote]

9楼10楼----- 这两者就是宏的最高境界了。道有千万,我取其一。
mislrb 2008-03-06
  • 打赏
  • 举报
回复
学习
dubiousway 2008-03-06
  • 打赏
  • 举报
回复
宏的应用和方法没撒差别
----- 什么意思。。。
uuussseeennn 2008-03-06
  • 打赏
  • 举报
回复
看看MFC里是怎么用宏来实现RTTI,动态创建对象,消息映射机制的,你会对宏有一个新的认识。
相关推荐
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-03-06 01:43
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下