樣例一:(不報錯)
#define div(a,b) a%b;
樣例二:(不報錯)
#define div(a,b) a%b
樣例三:(不報錯)
#define change(a,b) t=a,a=b,b=t;
樣例四:(不報錯)
#define change(a,b) t=a,a=b,b=t
樣例五:(報錯)
#define s(a,b,c) ((a+b+c)/2);
#define area(a,b,c,S) sqrt(S*(S-a)*(S-b)*(S-c));
樣例六:(不報錯)
#define s(a,b,c) ((a+b+c)/2)
#define area(a,b,c,S) sqrt(S*(S-a)*(S-b)*(S-c))
想請問一下為什么在CB中樣例五會報錯,如何判斷帶引數的宏定義后邊加不加“ ; ”?
uj5u.com熱心網友回復:
你用的是全角分號吧uj5u.com熱心網友回復:
報什么錯誤?在代碼里又是如何使用s, area呢?這些是關鍵,不能說單單的宏定義會報錯或不報錯。重點是如何用的,宏定義就是等價替換,放在代碼里看看是否符合語法規則~uj5u.com熱心網友回復:
VC編譯選項加/EP /P(專案、屬性、配置屬性、C/C++、前處理器、預處理到檔案:是,預處理取消顯示行號:是),重新編譯,查看宏展開后對應的.i檔案。gcc加-E http://bbs.csdn.net/topics/391003898uj5u.com熱心網友回復:
如果s(a,b,c) 在后面代碼中直接參與運算,則不加分號,比如s(a,b,c) +123; //這個里s不能有加號
直接呼叫,不參與運算則可以加,建議不要加了
s(a,b,c)
uj5u.com熱心網友回復:

你看一下,就是這樣報錯,其他的情況都沒問題。
uj5u.com熱心網友回復:
用的是半角符號uj5u.com熱心網友回復:
我感徑訓不會是連續宣告兩個宏定義,所以兩者之間不能有 " ; " ? 當只有一個宏定義的時候,“ ; ”便可有可無?不太明白為什么。。。求大神空降回答。
uj5u.com熱心網友回復:
宏就是文本替換,你那個肯定不對。相當于
printf("...",xxxxxx ;);
uj5u.com熱心網友回復:
肯定不行呢,看看樓上這位大咖已經給你等價替換出來了。uj5u.com熱心網友回復:
所以說所有的宏定義最后邊都不需要 " ; " 對嗎?
可是為什么在某些情況下又可以呢?
比如說:
uj5u.com熱心網友回復:
這個相當于執行一次空陳述句,再多加幾個也沒感覺t = div(x,y);;;;;;
uj5u.com熱心網友回復:
用do {……} while(0)括住宏,解決分號結束問題。uj5u.com熱心網友回復:
這個相當于執行一次空陳述句,再多加幾個也沒感覺 宏就是文本替換,你那個肯定不對。
相當于
printf("...",xxxxxx ;);
所以說所有的宏定義最后邊都不需要 " ; " 對嗎?
可是為什么在某些情況下又可以呢?
比如說:
t = div(x,y);;;;;;
明白了。謝謝大佬
uj5u.com熱心網友回復:
這個相當于執行一次空陳述句,再多加幾個也沒感覺 宏就是文本替換,你那個肯定不對。
相當于
printf("...",xxxxxx ;);
所以說所有的宏定義最后邊都不需要 " ; " 對嗎?
可是為什么在某些情況下又可以呢?
比如說:
t = div(x,y);;;;;;
怎么會對?“;”代表的陳述句的結束,但是你前面是呼叫printf函式,函式呼叫時,函式名后面的括號一定要匹配,所以肯定不對啊
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/277843.html
標籤:C語言
上一篇:在查詢資料庫時遇到的一個問題
