|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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.ij = (((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也就这样产生了!
// 宏真是要注意点啊, 结果真是让我好苦啊!!!!!!
|
|