分享知识

与大家一起分享知识

C++博客 首页 新随笔 联系 聚合 管理
  19 Posts :: 3 Stories :: 45 Comments :: 0 Trackbacks

在C/C++中,预处理宏需要注意几点:
1)看看两个语句:
typedef struct _person
{
char m_strName[16];
int m_nAge;
}*TPPerson;

#define DPPerson \
struct _person \
{ \
char m_strName[16];\
int m_nAge; \
}*
现在我们有如下定义:TPPerson tp1,tp2; DPPerson dp1,dp2;
tp1 = tp2; dp1 = dp2;
上面第一条语句不会出错,没有任何问题。因为tp1,tp2都是对象指针,但是第二条语句就会出现问题,因为dp1是一个对象指针,而dp2是一个对象,这个宏隐藏的错误。
2)define SQUARE(X) (X)*(X)
这是求一个数的平方,但是在程序中如果有这样的语句:int x = 5,y; y = SQUARE(++x),这是一个逻辑错误又产生了。求得的实际值是42,而不是36。
3)字符串定义和标志粘贴
看看这两个宏定义:
#define TRACE(X) cout<< #X << " = " << X << endl;
#define MEMBER(A) char* A##_string;int A##_size
第一条可以打印出任何一个表达式的值,第二条可以把两个字符串合并成一个变量,看下面的例子:
#include
#define TRACE(X) cout<< #X << " = " << X << endl;
#define MEMBER(A) char* A##_string;int A##_size
using namespace std;

int main()
{
for(int i = 0;i < 10;i++)
TRACE((3+i));
MEMBER(one);
one_string = "Hello";
one_size = 4;
cout << one_string << ":" << one_size << endl;

return 0;
}
运行结果是:
(3+i) = 3
(3+i) = 4
(3+i) = 5
(3+i) = 6
(3+i) = 7
(3+i) = 8
(3+i) = 9
(3+i) = 10
(3+i) = 11
(3+i) = 12
Hello:4

posted on 2006-04-12 15:57 史传红 阅读(448) 评论(1)  编辑 收藏 引用 所属分类: C/C++细节知识

Feedback

# re: C++ Thinking 学习笔记之二----说说C/C++的预处理宏 2006-04-12 18:08 Stone Jiang
宏是C++中多余的东西, (源自C++ Coding Standards)
通过用const 和inline,能完成大部分宏的作用.

宏也的确能加快编码和可读性,像MFC,ATL的一堆宏
但它的副作用是让C++变得有点不像C++.
  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理