| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1362 人关注过本帖
标题:求助宏定义的使用!
只看楼主 加入收藏
duwn124
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2010-8-10
结帖率:77.78%
收藏
已结贴  问题点数:20 回复次数:9 
求助宏定义的使用!
#include<stdio.h>
#define pt 2
#define s(x) pt*x*x
main()
{
    int a=1,b=2;
    printf("%d\n",s(a+b));
    getch();
}
麻烦哪位高人给解释下上面这个程序运行的结果为什么是6而不是18呢?谢谢了
搜索更多相关主题的帖子: 定义 
2010-08-16 21:04
duwn124
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2010-8-10
收藏
得分:0 
额,突然恍然大悟,a+b带入是不带括号的....
2010-08-16 21:10
Rexfield
Rank: 6Rank: 6
来 自:幻想乡
等 级:侠之大者
威 望:1
帖 子:240
专家分:484
注 册:2010-7-28
收藏
得分:0 
那个宏展开就是:
pt*a+b*a+b=2*1+2*1+2=2+2+2=6

你应该这样定义:
#define s(x) (pt*(x)*(x))

[ 本帖最后由 Rexfield 于 2010-8-17 11:37 编辑 ]

If you're not failing every now and again, it's a sign you're not doing anything very innovative.
2010-08-16 21:11
duwn124
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2010-8-10
收藏
得分:0 
回复 3楼 Rexfield
要得到18的话应该把后边部分的x单独用括号括起来才ok!
2010-08-16 21:13
新浪
Rank: 3Rank: 3
来 自:水星
等 级:论坛游侠
威 望:1
帖 子:770
专家分:167
注 册:2008-6-10
收藏
得分:0 
//#define BLUEGUY_MARK
#ifdef BLUEGUY_MARK
  #define chSTR2(x)   #x   
 #define chSTR(x)    chSTR2(x)   
 #define chMSG(desc)     message(__FILE__"("chSTR(__LINE__)"):"#desc)
 #define NOT_IMPLEMENT_YET chMSG(NOT_IMPLEMENT_YET)  
 #pragma NOT_IMPLEMENT_YET
#endif
给你一个实用的宏定义吧

跟别人学的,可以节省我 10% 的劳动力。

[ 本帖最后由 新浪 于 2010-8-16 21:16 编辑 ]

天下皆醒,唯我独醉;  天下皆白,唯我独黑
2010-08-16 21:14
lizanle521
Rank: 1
等 级:新手上路
帖 子:16
专家分:3
注 册:2010-8-7
收藏
得分:0 
回复 5楼 新浪
这个不懂。。。。
2010-08-16 23:26
新浪
Rank: 3Rank: 3
来 自:水星
等 级:论坛游侠
威 望:1
帖 子:770
专家分:167
注 册:2008-6-10
收藏
得分:0 
标记待实现功能
2009年08月7日, 12:10 下午   1,088 views
有时为了快速的把代码的架子搭起来,并编译通过。会把一些负责具体实现细节的方法先空置。整个代码能编译通过后,再一边调试一边把那些空方法“填”好。

我一般是在这类空方法中加一个注释进行标注, 并让方法直接返回一个错误值。比如返回指针的方法就让它返回NULL,返回BOOL值的方法就让它返回false。有时还会在方法里放一个失败的断言,比如:

view plaincopy to clipboardprint?
BOOL some_function()   
{   
   //PK Not implement yet   
   assert(false);   
   return FALSE;   
}  

BOOL some_function()
{
   //PK Not implement yet
   assert(false);
   return FALSE;
}

这样如果实在忘了实现这个方法了,在调试时当代码运动到这里时就会触发断言。

最近在新版的《windows核心编程》的附录里看到一个超好的技巧,更好的解决了标注的问题。象上面我用的那两个方法,还不是很方便。注释法,需要自己记得不停去全局搜特定的注释,如果忘了搜,或是输入注释时敲错了单词,就容易漏掉。如果程序的逻辑没有运行到放置了断言的方法中,断言法也就不起作用了。

《windows核心编译》里提供的这个方法更好的解决了这些问题。它通过一个预处理指令(#pragma message)在编译时输出一行指定的信息,并且通过一个宏定义在指定的信息前输出这个指令所在的文件名和行号。这样我们就可以象操作编译错误时一样,在output窗口中双击那一行信息,自动定位到指令所在的行上。

下面就是这个宏的定义:

view plaincopy to clipboardprint?
#define chSTR2(x)   #x   
#define chSTR(x)    chSTR2(x)   
#define chMSG(desc)     message(__FILE__"("chSTR(__LINE__)"):"#desc)  

#define chSTR2(x)    #x
#define chSTR(x)    chSTR2(x)
#define chMSG(desc)     message(__FILE__"("chSTR(__LINE__)"):"#desc)
这个定义虽然简单但很精巧,__FILE__和__LINE__是两个预处理器定义的宏,值分别为当前的文件名和行号。#将它后面的的宏变量求值并字符串化。

建议直接把这三行COPY到stdafx.h头文件中,这样在工程的所有地方都可以引用。

利用这个宏,我们只需要在代码里需要标注的地方输入如下的行,注意括号内的内容不需要用引用括住,因为我们用了#进行字符串化。

view plaincopy to clipboardprint?
BOOL some_function()   
{   
#pragma chMSG(not implement yet)   
   return FALSE;   
}  

BOOL some_function()
{
#pragma chMSG(not implement yet)
   return FALSE;
}
编译时会在output窗口中产生类似下面的输出:

1>d:\my_project\trunk\aural_superman\write_component_collection.cpp(86):not implement yet
双击就可以跳到相应的代码行。

我在这个基础上又加了一个宏:

view plaincopy to clipboardprint?
#define NOT_IMPLEMENT_YET chMSG(not implement yet)  

#define NOT_IMPLEMENT_YET chMSG(not implement yet)
这样只需要以下行:

view plaincopy to clipboardprint?
#pragma NOT_IMPLEMENT_YET  

#pragma NOT_IMPLEMENT_YET
就可以做标记了。

用这种方式,还可以定义很多其他的标记。比如:对需要在以后进行优化的地方,我们可以定义以下的标记宏:

view plaincopy to clipboardprint?
#define OPTIMIZATION chMSG(should be optimized)  

#define OPTIMIZATION chMSG(should be optimized)
由于#在预处理指令里有特殊功能,而预处理系统又不提供转义符。所以我没找到方法把#pragma也塞到宏定义里面去。如果可以放进去的话,会更简洁。哪位达人如果知道方法的话,请记得告诉我。

天下皆醒,唯我独醉;  天下皆白,唯我独黑
2010-08-17 08:51
Alen0128
Rank: 4
等 级:业余侠客
帖 子:171
专家分:222
注 册:2009-12-26
收藏
得分:0 
回复 3楼 Rexfield
你那个宏是怎么展开的?

-不想让你发现我 凌乱的脚步 ,我努力 跟上你的速度
2010-08-17 11:28
Rexfield
Rank: 6Rank: 6
来 自:幻想乡
等 级:侠之大者
威 望:1
帖 子:240
专家分:484
注 册:2010-7-28
收藏
得分:0 
咕~看错了。。。

If you're not failing every now and again, it's a sign you're not doing anything very innovative.
2010-08-17 11:36
duwn124
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2010-8-10
收藏
得分:0 
回复 9楼 Alen0128
把a+b直接代入,记住这里的a+b是不带括号的,这样就可以得到3楼的方法...
2010-08-18 11:47
快速回复:求助宏定义的使用!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020015 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved