久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3946|回復: 0
打印 上一主題 下一主題
收起左側

復雜的宏定義---之一

[復制鏈接]
跳轉到指定樓層
樓主
ID:104126 發表于 2016-1-23 00:50 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
關于宏定義我想通過__LINE__表示不同的行號來定義不同的系統時間變量用以不同地方的打印時間,如

關于宏定義
我想通過__LINE__表示不同的行號來定義不同的系統時間變量用以不同地方的打印時間,如下:

  C/C++code
   #defineLINE__ __LINE__ #define LINE(sys) sys##LINE__ SYSTEMTIME LINE(sys);GetLocalTime(&LINE(sys)); printf( "M/d/d d:d:d.d星期\n",LINE(sys).wYear,LINE(sys).wMonth,LINE(sys).wDay,LINE(sys).wHour,LINE(sys).wMinute,LINE(sys).wSecond,LINE(sys).wMilliseconds,LINE(sys).wDayOfWeek);#endif

編譯發現__LINE__并不會被先替換成行號,而且多出定義會出現重復定義的錯誤,直接用#define LINE(sys)sys##__LINE__也會出錯,更直接的在定義的時候:SYSTEMTIMEsys##__LINE__;來定義,錯誤更離譜。這是為什么呢?




1條回答


#與##在宏定義中的--宏展開
#include
#define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)
int main()
{
printf("%s\n", h(f(1,2))); // 12
printf("%s\n", g(f(1,2))); // f(1,2)
return 0;
}
宏展開時:
如果宏定義以#開頭,不展開參數,直接替換。
故g(f(1,2))--->#f(1,2)---$amp;>amp;$quot;f(1,2)";
如果宏定義不以#開頭,展開參數,直接替換,由外層向里層,如果碰到的是#開頭的宏,不繼續往里層展開,往外層展開。
由外層向里層,如果碰到的是以非#開頭的宏,繼續往里層走,直至最里層,開始一層層往外層展開。
故h(f(1,2))--->h(12)--->g(12)---->#12-----$amp;>amp;$quot;12"。
PS:
##在宏中定義,是字符連接符
如a##b##c 等同于 "abc"
#在宏開頭出現,是表示宏展開的方式不同
#a 等同于"a"
#abc 等同于 "abc"
復雜的:
#include
#define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)
int main()
{
char a = 'a';
cout$amp;
cout$amp;
printf("%s\n", h(f(1,2))); // 12
printf("%s\n", g(f(1,2))); // f(1,2)
printf("%s\n", g(h(f(1,2)))); // h(f(1,2))
printf("%s\n", h(g(f(1,2)))); // "f(1,2)"
printf("%s\n", h(h(f(1,2)))); // "12"
system("pause");
return 0;
}
預處理后的:(在編譯選項中添加/EP /P后編譯生成的.i文件)
int main()
{
char a = 'a';
cout$amp;
cout$amp;
printf("%s\n", "12");
printf("%s\n", "f(1,2)");
printf("%s\n", "h(f(1,2))");
printf("%s\n", "\"f(1,2)\"");
printf("%s\n", "\"12\"");
system("pause");
return 0;
}
---------------------------------------------------
宏解析
1. ##操作符
##操作符它的作用是在替代表中將其前后的參數連接成為一個預處理符號,它不能出現于宏替代表的開端和末尾。
例:
#define concat(s,t) s##t
#define AAA ABC
concat(A, AA)
將被替換成
ABC
2. 重新掃描和替換
在替換列表中的所有參數替換過之后,預處理器將對結果token序列重新掃描以便對其中的宏再次替換。
當正在替換的宏在其替換列表中發現自身時,就不再對其進行替換。今兒,在任何正在嵌套替換的宏的替換過程中遇到正被替換的宏就對其不再進行替換(防止遞歸)。
例:
#define ROOT AAA CCC
#define AAA ROOT
ROOT
將被替換成
ROOT CCC







分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品二区 | 亚洲高清视频一区二区 | 91精品国产自产精品男人的天堂 | 91中文在线观看 | 精品九九九 | 99精品一区二区 | 91国内视频在线 | 高清一区二区三区 | 99精品国产在热久久 | 天堂色| 国产女人与拘做视频免费 | 亚洲九九 | 91精品国产91久久综合桃花 | 九九99靖品| 毛片站 | 国产一区二区三区日韩 | 午夜影晥 | 欧美日韩精品 | 亚洲欧美一区二区三区国产精品 | 不卡视频在线 | 久久久久久成人 | 精品国产乱码久久久久久蜜柚 | 欧美9999 | 久久精品国产免费 | jlzzjlzz国产精品久久 | 黄色成人亚洲 | 亚洲高清视频在线观看 | 国产一区二区三区免费 | 视频一区二区在线观看 | 国产精品免费一区二区三区四区 | 久久久久成人精品亚洲国产 | 中文字幕一区二区在线观看 | 亚洲一区| 精品国产乱码久久久久久果冻传媒 | 一区二区三区四区在线视频 | 人人爽人人爽人人片av | 国产在线不卡视频 | 成人福利影院 | 成人综合在线视频 | 一级高清免费毛片 | 涩涩视频网站在线观看 |