c/c++中,有這樣的乙個預處理,就是define 可以用 #define 定義乙個識別符號來表示乙個常量。特點是:定義的識別符號不佔記憶體,只是乙個臨時的符號,預編譯後這個符號就不存在了。define被稱作是巨集定義使用起來十分的方便簡單,比如下面的例子
#define n 1000000
這是乙個簡單的巨集定義,就是n值為1000000可以直接用到陣列裡舉個比較簡單的例子吧
#include
#define n 1000000
using
namespace std;
int a[n]
,b[n]
,c[n]
;
這樣就相當於定義了a,b,c三個大小都為1000000的陣列,當你發現測試資料越界時也可以直接改#define n 1000000
進行補救,這樣不必手打1000000,而且更改方便
如果你下面要更新一下這個字母代表的數字你需要#undef
命令
#undef n
#define s sleep(900)
然後你就可以用s來代替sleep(900)
了簡單實用,比如下面這個例子
#include
//習慣打萬能頭了
#include
//因為要用到sleep()函式,所以載入windows庫
#define s9 sleep(900)
#define s5 sleep(500)
using
namespace std;
intmain()
當然用代替一段**時可以寫出來這樣的詭異**
#include
//習慣打萬能頭了
#include
//因為要用到sleep()函式,所以載入windows庫
#define s9 sleep(900);
//加了分號
#define s5 sleep(500);
//加了分號
using
namespace std;
intmain()
是不是詭異至極?沒加分號也能編譯?!!,實際上是不正確的,在編譯器裡這個s9和s5已經變成了後面的sleep(900),sleep(500)
了這樣就相當於s9,s5已經至極替換為上面的了,自然不用加分號,如果加上也沒什麼大問題,這裡只不過更好理解其特性罷了
這裡想必大家已經看出了大概,就是#define a b
a就是b的另乙個稱呼罷了a為it b為int 時就做到了能用it a
代表int a
這裡你可能會說,也不過如此嘛,但實際上define還有更高階的應用,就是他帶引數
#define max(x,y) ((x)>(y)?(x):(y))
i=max
(j+k,m-n)
;
這就是含有x,y雙引數的乙個巨集定義而且這些引數甚至可以是表示式
帶引數的巨集和帶參函式很相似,但有本質上的不同,把同一表示式用函式處理與用巨集處理兩者的結果有可能是不同的。
下面舉乙個例子進行對比:
#include
using
namespace std;
intsq
(int y)
intmain()
和
#include
#define sq(y) ((y)*(y))
using
namespace std;
intmain()
跑一下,是不是答案不一樣?
在使用函式的例子中,函式呼叫是把實參i值傳給形參y後自增1。然後輸出函式值。因而要迴圈5次。輸出1~5的平方值。
而在使用巨集的例子中,巨集呼叫時,只作代換。sq(i++)被代換為((i++)*(i++))。這就造成的兩種結果的天差地別,所以要根據題目或應用合理選擇,充分發揮其價值
在用#define 定義時 , 斜槓" \ 「是用來續行的,」#「用來把引數轉換成字串,是給引數加上雙引號。」##「則用來連線前後兩個引數,把它們變成乙個字串,」#@"是給引數加上單引號。
比如:
#define conn(x,y) x##y
#define tochar(a) #@a
#define tostring(x) #x
int n =
conn
(123
,456
); 結果就是n=
123456
;char
* str =
conn
("asdf"
,"adf"
)結果就是 str =
"asdfadf"
;char a =
tochar(1
);結果就是a=
'1';
char
* str =
tostring
(123132
);就成了str=
"123132"
;
define還可以巢狀
#define n 456
#define s n*9998+y
C C define巨集定義
連線前後兩個值 define connect a,b a b int c combom 1,2 c 12 給後面的字元新增雙引號 define combom b b std string c combom laji cout c endl 和 在乙個巨集語句中只能使用乙個 給後面新增單引號 用 和 ...
vuex 的用法(語法糖)
mapactions 和 mapgetters都是vuex提供的語法糖,在底層已經封裝好了,拿來就能用,簡化了很多操作。其中.mapactions clickafn 相當於this.store.dispatch clickafn mapactions中只需要指定方法名即可,引數省略。mapgette...
巨集定義 號用法
define s x 自動給引數x轉換為 x 轉換為字串 這裡的語言符號不一定是巨集的變數 include define s x system x void main c語言中 被稱為連線符 它是一種預處理運算子,用來把兩個語言符號 token 組合成單個語言符號 這裡的語言符號不一定是巨集的變數。...