c语言中的宏

//以前就听说c语言中宏很复杂,要慎用, 今天终于让我遇见了,耗费了我十分长的时间呀!!! 下面将代码奉上, 交流一下
[code]
#include <stdio.h>
#include <windows.h>
#include "data.h"

#define min(a, b) (((a) < (b) ? (a) : (b)))
#define max(a, b) (((a) > (b) ? (a) : (b)))

int main()
{
    int i = -1;
    int j;
   
    j = max(0, min(i, NUMLINES - 1));
   
    printf("j ================ %d\n", j);
   
    return 0;
}
[/code]//hong.c  文件
[code]
#define NUMLINES (sizeof(sysmetrics) / sizeof(sysmetrics[0]))

struct
{
    int iIndex;
    TCHAR *szLabel;
    TCHAR *szDesc;
}sysmetrics[] =
{
    SM_CXSCREEN, TEXT ("SM_CXSCREEN"), TEXT ("Screen width in pixels"),
   
    SM_CYSCREEN, TEXT ("SM_CYSCREEN"), TEXT ("Screen height in pixels"),
   
    SM_CXVSCROLL, TEXT ("SM_CXVSCROLL"), TEXT ("Vertical scroll width"),                                   
   
    SM_CYHSCROLL, TEXT ("SM_CYHSCROLL"), TEXT ("Horizontal scroll height"),            
   
    SM_CYCAPTION, TEXT ("SM_CYCAPTION"), TEXT ("Caption bar height"),                       
   
    SM_CXBORDER, TEXT ("SM_CXBORDER"),  TEXT ("Window border width"),                      
   
    SM_CYBORDER, TEXT ("SM_CYBORDER"),  TEXT ("Window border height"),                         
   
    SM_CXFIXEDFRAME, TEXT ("SM_CXFIXEDFRAME"), TEXT ("Dialog window frame width"),                       
   
    SM_CYFIXEDFRAME, TEXT ("SM_CYFIXEDFRAME"), TEXT ("Dialog window frame height"),                       
   
    SM_CYVTHUMB, TEXT ("SM_CYVTHUMB"), TEXT ("Vertical scroll thumb height"),                   
   
    SM_CXHTHUMB, TEXT ("SM_CXHTHUMB"), TEXT ("Horizontal scroll thumb width"),                         
   
    SM_CXICON,  TEXT ("SM_CXICON"),  TEXT ("Icon width"),                      
   
    SM_CYICON,  TEXT ("SM_CYICON"),  TEXT ("Icon height"),                           
   
    SM_CXCURSOR, TEXT ("SM_CXCURSOR"), TEXT ("Cursor width"),                         
   
    SM_CYCURSOR, TEXT ("SM_CYCURSOR"), TEXT ("Cursor height"),                        
   
    SM_CYMENU, TEXT ("SM_CYMENU"),TEXT ("Menu bar height"),                   
   
    SM_CXFULLSCREEN, TEXT ("SM_CXFULLSCREEN"), TEXT ("Full screen client area width"),
   
    SM_CYFULLSCREEN, TEXT ("SM_CYFULLSCREEN"), TEXT ("Full screen client area height"),               
   
    SM_CYKANJIWINDOW, TEXT ("SM_CYKANJIWINDOW"), TEXT ("Kanji window height"),                         
   
    SM_MOUSEPRESENT, TEXT ("SM_MOUSEPRESENT"), TEXT ("Mouse present flag"),
   
    SM_CYVSCROLL, TEXT ("SM_CYVSCROLL"), TEXT ("Vertical scroll arrow height"),
   
    SM_CXHSCROLL, TEXT ("SM_CXHSCROLL"), TEXT ("Horizontal scroll arrow width"),                         
   
    SM_DEBUG, TEXT ("SM_DEBUG"),  TEXT ("Debug version flag"),                      
   
    SM_SWAPBUTTON, TEXT ("SM_SWAPBUTTON"), TEXT ("Mouse buttons swapped flag"),                      
   
    SM_CXMIN, TEXT ("SM_CXMIN"), TEXT ("Minimum window width"),
   
    SM_CYMIN, TEXT ("SM_CYMIN"), TEXT ("Minimum window height"),                            
   
    SM_CXSIZE, TEXT ("SM_CXSIZE"), TEXT ("Min/Max/Close button width"),                       
   
    SM_CYSIZE,  TEXT ("SM_CYSIZE"),  TEXT ("Min/Max/Close button height"),                                  
   
    SM_CXSIZEFRAME, TEXT ("SM_CXSIZEFRAME"),  TEXT ("Window sizing frame width"),                        
   
    SM_CYSIZEFRAME,  TEXT ("SM_CYSIZEFRAME"),    TEXT ("Window sizing frame height"),                            
   
    SM_CXMINTRACK, TEXT ("SM_CXMINTRACK"),TEXT ("Minimum window tracking width"),
   
    SM_CYMINTRACK, TEXT ("SM_CYMINTRACK"), TEXT ("Minimum window tracking height"),                       
   
    SM_CXDOUBLECLK,  TEXT ("SM_CXDOUBLECLK"), TEXT ("Double click x tolerance"),                    
   
    SM_CYDOUBLECLK,  TEXT ("SM_CYDOUBLECLK"), TEXT ("Double click y tolerance"),                        
   
    SM_CXICONSPACING, TEXT ("SM_CXICONSPACING"), TEXT ("Horizontal icon spacing"),                      
   
    SM_CYICONSPACING, TEXT ("SM_CYICONSPACING"), TEXT ("Vertical icon spacing"),                       
   
    SM_MENUDROPALIGNMENT, TEXT ("SM_MENUDROPALIGNMENT"),TEXT ("Left or right menu drop"),                 
   
    SM_PENWINDOWS,  TEXT ("SM_PENWINDOWS"), TEXT ("Pen extensions installed"),                        
   
    SM_DBCSENABLED,  TEXT ("SM_DBCSENABLED"), TEXT ("Double-Byte Char Set enabled"),                          
   
    SM_CMOUSEBUTTONS, TEXT ("SM_CMOUSEBUTTONS"), TEXT ("Number of mouse buttons"),       
   
    SM_SECURE, TEXT ("SM_SECURE"), TEXT ("Security present flag"),                         
   
    SM_CXEDGE, TEXT ("SM_CXEDGE"), TEXT ("3-D border width"),                              
   
    SM_CYEDGE, TEXT ("SM_CYEDGE"), TEXT ("3-D border height"),                        
   
    SM_CXMINSPACING, TEXT ("SM_CXMINSPACING"), TEXT ("Minimized window spacing width"),    
   
    SM_CYMINSPACING, TEXT ("SM_CYMINSPACING"),  TEXT ("Minimized window spacing height"),                  
   
    SM_CXSMICON,TEXT ("SM_CXSMICON"),TEXT ("Small icon width"),                         
   
    SM_CYSMICON, TEXT ("SM_CYSMICON"),TEXT ("Small icon height"),      
   
    SM_CYSMCAPTION, TEXT ("SM_CYSMCAPTION"), TEXT ("Small caption height"),                          
   
    SM_CXSMSIZE, TEXT ("SM_CXSMSIZE"), TEXT ("Small caption button width"),                        
   
    SM_CYSMSIZE, TEXT ("SM_CYSMSIZE"), TEXT ("Small caption button height"),                     
   
    SM_CXMENUSIZE,TEXT ("SM_CXMENUSIZE"),TEXT ("Menu bar button width"),                     
   
    SM_CYMENUSIZE, TEXT ("SM_CYMENUSIZE"), TEXT ("Menu bar button height"),                      
   
    SM_ARRANGE, TEXT ("SM_ARRANGE"), TEXT ("How minimized windows arranged"),                        
   
    SM_CXMINIMIZED, TEXT ("SM_CXMINIMIZED"), TEXT ("Minimized window width"),                      
   
    SM_CYMINIMIZED, TEXT ("SM_CYMINIMIZED"), TEXT ("Minimized window height"),        
   
    SM_CXMAXTRACK, TEXT ("SM_CXMAXTRACK"), TEXT ("Maximum draggable width"),                     
   
    SM_CYMAXTRACK, TEXT ("SM_CYMAXTRACK"), TEXT ("Maximum draggable height"),         
   
    SM_CXMAXIMIZED, TEXT ("SM_CXMAXIMIZED"),TEXT ("Width of maximized window"),                                                     
   
    SM_CYMAXIMIZED, TEXT ("SM_CYMAXIMIZED"),TEXT ("Height of maximized window"),                   
   
    SM_NETWORK,  TEXT ("SM_NETWORK"), TEXT ("Network present flag"),                        
   
    SM_CLEANBOOT,TEXT ("SM_CLEANBOOT"),TEXT ("How system was booted"),                              
   
    SM_CXDRAG, TEXT ("SM_CXDRAG"),TEXT ("Avoid drag x tolerance"),                      
   
    SM_CYDRAG, TEXT ("SM_CYDRAG"), TEXT ("Avoid drag y tolerance"),                   
   
    SM_SHOWSOUNDS, TEXT ("SM_SHOWSOUNDS"),TEXT ("Present sounds visually"),                      
   
    SM_CXMENUCHECK, TEXT ("SM_CXMENUCHECK"), TEXT ("Menu check-mark width"),                     
   
    SM_CYMENUCHECK, TEXT ("SM_CYMENUCHECK"),TEXT ("Menu check-mark height"),                   
   
    SM_SLOWMACHINE, TEXT ("SM_SLOWMACHINE"),TEXT ("Slow processor flag"),
   SM_MIDEASTENABLED, TEXT ("SM_MIDEASTENABLED"),  TEXT ("Hebrew and Arabic enabled flag"),                                            
};
[/code]//data.h 文件 其实主要是里面的宏
然后运行上面的程序, 你会发现结果是 j ========== 67
呵呵,如果只看hong.c文件的简单程序直接感觉是0呀,67是怎么来的呢? 这就是宏啊, 我后来终于查出这个问题了, 然后将其放在gcc下预编译,得到hong.i文件,
[code]
j = (((0) > ((((i) < ((sizeof sysmetrics / sizeof sysmetrics[0]) - 1) ? (i) : ((sizeof sysmetrics / sizeof sysmetrics[0]) - 1)))) ? (0) : ((((i) < ((sizeof sysmetrics / sizeof sysmetrics[0]) - 1) ? (i) : ((sizeof sysmetrics / sizeof sysmetrics[0]) - 1))))));
[/code]//这就是那个宏展开的代码,仔细看会发现其中的括号巨多,也巨复杂,结果67也就这样产生了!
//   宏真是要注意点啊, 结果真是让我好苦啊!!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lswsmj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值