鱼C论坛

 找回密码
 立即注册
查看: 1815|回复: 2

[技术交流] c语言中|宏|的问题

[复制链接]
发表于 2015-1-11 16:57:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 swsm 于 2015-1-11 17:01 编辑

//以前就听说c语言中宏很复杂,要慎用, 今天终于让我遇见了,耗费了我十分长的时间呀!!! 下面将代码奉上, 交流一下
//hong.c  文件
#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;
}
//data.h 文件
#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"),                                             
};
// 其实主要是里面的宏
然后运行上面的程序, 你会发现结果是 j ========== 67
呵呵,如果只看hong.c文件的简单程序直接感觉是0呀,67是怎么来的呢? 这就是宏啊, 我后来终于查出这个问题了, 然后将其放在gcc下预编译,得到hong.i文件, 命令是: gcc -E hong.c -o hong.i
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))))));
//这就是那个宏展开的代码,仔细看会发现其中的括号巨多,也巨复杂,结果67也就这样产生了!
//   宏真是要注意点啊, 结果真是让我好苦啊!!!!!!


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-1-11 17:57:45 | 显示全部楼层
这个宏不算复杂的,深入起来比这难的多。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-11 20:37:28 | 显示全部楼层
╰☆忝婲雨☆╮ 发表于 2015-1-11 17:57
这个宏不算复杂的,深入起来比这难的多。

是的, 这个只是一个提醒,往往觉得是正确的,但是宏一展开就错了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 14:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表