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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

#define用法

[復制鏈接]
跳轉到指定樓層
樓主
ID:99624 發表于 2015-12-27 05:16 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
1.簡單的define定義
#define MAXTIME 1000
一個簡單的MAXTIME就定義好了,它代表1000,如果在程序里面寫
if(i<MAXTIME){.........}
編譯器在處理這個代碼之前會對MAXTIME進行處理替換為1000。
這樣的定義看起來類似于普通的常量定義CONST,但也有著不同,因為define的定義更像是簡單的文本替換,而不是作為一個量來使用,這個問題在下面反映的尤為突出。
2.define的“函數定義”
define可以像函數那樣接受一些參數,如下
#define max(x,y) (x)>(y)?(x):(y);
這個定義就將返回兩個數中較大的那個,看到了嗎?因為這個“函數”沒有類型檢查,就好像一個函數模板似的,當然,它絕對沒有模板那么安全就是了。可以作為一個簡單的模板來使用而已。
但是這樣做的話存在隱患,例子如下:
#define Add(a,b) a+b;
在一般使用的時候是沒有問題的,但是如果遇到如:c * Add(a,b) *d的時候就會出現問題,代數式的本意是a+b然后去和c,d相乘,但是因為使用了define(它只是一個簡單的替換),所以式子實際上變成了
c*a + b*d
另外舉一個例子:
#define pin (int*);
pin a,b;
本意是a和b都是int型指針,但是實際上變成int* a,b;
a是int型指針,而b是int型變量。
這是應該使用typedef來代替define,這樣a和b就都是int型指針了。
所以我們在定義的時候,養成一個良好的習慣,建議所有的層次都要加括號。
3.宏的單行定義
#define A(x) T_##x
#define B(x) #@x
#define C(x) #x
我們假設:x=1,則有:
A(1)------〉T_1
B(1)------〉'1'
C(1)------〉"1"
(這里參考了 hustli的文章)
4.define的多行定義
define可以替代多行的代碼,例如MFC中的宏定義(非常的經典,雖然讓人看了惡心)
#define MACRO(arg1, arg2) do {

stmt1;
stmt2;

} while(0)
關鍵是要在每一個換行的時候加上一個""


5.在大規模的開發過程中,特別是跨平臺和系統的軟件里,define最重要的功能是條件編譯。
就是:
#ifdef WINDOWS
......
......
#endif
#ifdef LINUX
......
......
#endif
可以在編譯的時候通過#define設置編譯環境
6.如何定義宏、取消宏
//定義宏
#define [MacroName] [MacroValue]
//取消宏
#undef [MacroName]
普通宏
#define PI (3.1415926)
帶參數的宏
#define max(a,b) ((a)>(b)? (a),(b))
關鍵是十分容易產生錯誤,包括機器和人理解上的差異等等。
7.條件編譯
#ifdef XXX…(#else) …#endif
例如 #ifdef DV22_AUX_INPUT
#define AUX_MODE 3
#else
#define AUY_MODE 3
#endif
#ifndef XXX … (#else) … #endif
8.頭文件(.h)可以被頭文件或C文件包含;
重復包含(重復定義)
由于頭文件包含可以嵌套,那么C文件就有可能包含多次同一個頭文件,就可能出現重復定義的問題的。
通過條件編譯開關來避免重復包含(重復定義)
例如
#ifndef __headerfileXXX__
#define __headerfileXXX__

文件內容

#endif

com相關的資料,看到CCmdTarget實現com接口的時候,去讀了一些宏的定義,在afxdisp.h頭文件中

#define BEGIN_INTERFACE_PART(localClass, baseClass)
class X##localClass : public baseClass

本來這個宏定義很容易理解的,但是這里多出個X##,我真沒見過這種用法,不曉得它是什么用意。
后來問了幾個朋友也都不知道。

你知道么?

也許你也不知道~呵呵,最后我還是找到了相關的資料,解讀了這個define,還順便認識了另外兩個不常用的define

#define Conn(x,y) x##y
#define ToChar(x) #@x
#define ToString(x) #x

x##y表示什么?表示x連接y,舉例說:
int  n =Conn(123,456);  結果就是n=123456;
char* str = Conn("asdf", "adf")結果就是 str = "asdfadf";
怎么樣,很神奇吧

再來看#@x,其實就是給x加上單引號,結果返回是一個constchar。舉例說:
char a = ToChar(1);結果就是a='1';
做個越界試驗char a = ToChar(123);結果是a='3';
但是如果你的參數超過四個字符,編譯器就給給你報錯了!error C2015: too many characters inconstant   :P

最后看看#x,估計你也明白了,他是給x加雙引號
char* str = ToString(123132);就成了str="123132";

最后留幾個小試驗給大家去測測:
#define Dec(x,y) (x-y)
int n = Dec( A(123,1), 1230);
n = Conn(123, Conn(123,332) );
char* str = A("12", ToString( Dec(3,1));
結果會如何呢? 嘿嘿嘿嘿~


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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜精品久久久久久久久久久久久 | 狼人伊人影院 | 九色视频网站 | 97起碰| 狠狠躁天天躁夜夜躁婷婷老牛影视 | 精品区| 成人欧美一区二区三区黑人孕妇 | 日韩av.com| 久久99蜜桃综合影院免费观看 | 亚洲精品乱码久久久久久黑人 | av第一页 | 九色 在线 | 亚洲一区二区在线免费观看 | 人人九九精 | 伊人伊人 | 九九热在线视频免费观看 | 成av人电影在线 | 99精品99| 久久精品亚洲精品 | 91久久精品日日躁夜夜躁欧美 | 视频一区在线 | 波多野结衣电影一区 | 日韩第一夜 | 精品国产免费一区二区三区演员表 | 91玖玖| 国产精品国产a级 | 国产精品亚洲一区二区三区在线 | 成人av片在线观看 | www.久草.com| 婷婷毛片| 91丨国产| 亚洲系列第一页 | 亚洲精久久久 | 欧美精品网 | 中文字幕视频一区 | 亚洲日日操 | 中文在线一区二区 | 亚洲精品久久久久国产 | 一区欧美 | 在线观看国产www | 日韩伦理电影免费在线观看 |