小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

define小結(jié)

 rookie 2012-01-03

1. 定義簡(jiǎn)單的常數(shù):定義常量,便于修改(切不可在后面加上分號(hào)!)
 #define N 1000
 等效于 const int N = 1000; 但略有不同,define只是簡(jiǎn)單替換,而不是作為一個(gè)量來(lái)使用.

2. 定義簡(jiǎn)單的函數(shù):注意多使用括號(hào)
 #define MAX(x, y) ((x) > (y)) ? (x) : (y)

3. 定義單行宏:主要有以下三種用法.
   1) 前加##或后加##,將標(biāo)記作為一個(gè)合法的標(biāo)識(shí)符的一部分.注意,不是字符串.多用于多行的宏定義中.例如:
#define A(x)  T_##x
則 int A(1) = 10; //等效于int T_1 = 10;
#define A(x)  Tx##__
則 int A(1) = 10; //等效于int T1__ = 10;
   2) 前加#@,將標(biāo)記轉(zhuǎn)換為相應(yīng)的字符,注意:僅對(duì)單一標(biāo)記轉(zhuǎn)換有效(理解有誤?)
 #define B(x)
#@x
 則B(a)即’a’,B(1)即’1’.但B(abc)卻不甚有效.
   3) 前加#,將標(biāo)記轉(zhuǎn)換為字符串.
 #define C(x) #x
 則C(1+1) 即 ”1+1”.

4. 定義多行宏:注意斜杠的使用,最后一行不能用斜杠.
 #define DECLARE_RTTI(thisClass, superClass)\
  virtual const char* GetClassName() const\
  {return #thisClass;}\
  static int isTypeOf(const char* type)\
  {\
   if(!strcmp(#thisClass, type)\
    return 1;\
   return superClass::isTypeOf(type);\
   return 0;\
  }\
  virtual int isA(const char* type)\
  {\
   return thisClass::isTypeOf(type);\
  }\
  static thisClass* SafeDownCast(DitkObject* o)\
  {\
   if(o&&o->isA(#thisClass))\
    return static_cast<thisClass*>(o);\
   return NULL;\
  }

5. 用于條件編譯:(常用形式)
 #ifndef _AAA_H
 #define _AAA_H
 //c/c++代碼
 #endif

6. 一些注意事項(xiàng):
  1) 不能重復(fù)定義.除非定義完全相同.#define A(x) … 和#define A 是重復(fù)定義.
  2) 可以只定義符號(hào),不定義值.如#define AAA


7. pragma

#include <cstdio>

#define PACK _Pragma("pack(push,1)")
#define UNPACK _Pragma("pack(pop)")

PACK

struct MyStruct {
char m_test[3];
int m_test2;
short m_test3;
};

UNPACK

關(guān)于記號(hào)粘貼操作符(token paste operator): ##
1. 簡(jiǎn)單的說(shuō),“##”是一種分隔連接方式,它的作用是先分隔,然后進(jìn)行強(qiáng)制連接
   其中,分隔的作用類(lèi)似于空格。我們知道在普通的宏定義中,預(yù)處理器一般把空格
   解釋成分段標(biāo)志
,對(duì)于每一段和前面比較,相同的就被替換。但是這樣做的結(jié)果是,
   被替換段之間存在一些空格。如果我們不希望出現(xiàn)這些空格,就可以通過(guò)添加一些
   ##來(lái)替代空格
。
   另外一些分隔標(biāo)志是,包括操作符,比如 +, -, *, /, [,], …,所以盡管下面的
   宏定義沒(méi)有空格,但是依然表達(dá)有意義的定義: define add(a, b)  a+b
   而其強(qiáng)制連接的作用是,去掉和前面的字符串之間的空格,而把兩者連接起來(lái)。
2. 舉列 – 試比較下述幾個(gè)宏定義的區(qū)別
   #define A1(name, type)  type name_##type##_type 或
   #define A2(name, type)  type name##_##type##_type
   A1(a1, int);  /* 等價(jià)于: int name_int_type; */
   A2(a1, int);  /* 等價(jià)于: int a1_int_type;   */
   解釋?zhuān)?br>         1) 在第一個(gè)宏定義中,”name”和第一個(gè)”_”之間,以及第2個(gè)”_”和第二個(gè)
   ”type”之間沒(méi)有被分隔,所以預(yù)處理器會(huì)把name_##type##_type解釋成3段:
   “name_”、“type”、以及“_type”,這中間只有“type”是在宏前面出現(xiàn)過(guò)
    的,所以它可以被宏替換。
        2) 而在第二個(gè)宏定義中,“name”和第一個(gè)“_”之間也被分隔了,所以
   預(yù)處理器會(huì)把name##_##type##_type解釋成4段:“name”、“_”、“type”
   以及“_type”,這其間,就有兩個(gè)可以被宏替換了。
        3) A1和A2的定義也可以如下:
           #define A1(name, type)  type name_  ##type ##_type  
                                      <##前面隨意加上一些空格>
           #define A2(name, type)  type name ##_ ##type ##_type
    結(jié)果是## 會(huì)把前面的空格去掉完成強(qiáng)連接,得到和上面結(jié)果相同的宏定義
3. 其他相關(guān) – 單獨(dú)的一個(gè) #
   至于單獨(dú)一個(gè)#,則表示 對(duì)這個(gè)變量替換后,再加雙引號(hào)引起來(lái)。比如
      #define  __stringify_1(x)   #x
那么
      __stringify_1(linux)   <==>  ”linux”
所以,對(duì)于MODULE_DEVICE_TABLE
     1) #define MODULE_DEVICE_TABLE(type,name)                        
             MODULE_GENERIC_TABLE(type##_device,name)
     2) #define MODULE_GENERIC_TABLE(gtype,name)                      
             extern const struct gtype##_id __mod_##gtype##_table     
             __attribute__ ((unused, alias(__stringify(name))))
得到  
      MODULE_DEVICE_TABLE(usb, products)  
                             /*notes: struct usb_device_id products; */
 <==> MODULE_GENERIC_TABLE(usb_device,products)
 <==> extern const struct usb_device_id __mod_usb_device_table     
             __attribute__ ((unused, alias(”products”)))   
注意到alias attribute需要一個(gè)雙引號(hào),所以在這里使用了__stringify(name)來(lái)
給name加上雙引號(hào)。另外,還注意到一個(gè)外部變量”__mod_usb_device_table”被alias
到了本驅(qū)動(dòng)專(zhuān)用的由用戶(hù)自定義的變量products<usb_device_id類(lèi)型>。這個(gè)外部變量
是如何使用的,更多的信息請(qǐng)參看《probe()過(guò)程分析》。
4. 分析方法和驗(yàn)證方式 – 編寫(xiě)一個(gè)簡(jiǎn)單的C程序
   用宏定義一個(gè)變量,同時(shí)用直接方式定義一個(gè)相同的變量,編譯報(bào)告重復(fù)定義;
   用宏定義一個(gè)變量,直接使用該宏定義的變量名稱(chēng),編譯通過(guò)且運(yùn)行結(jié)果正確;
   使用printf打印字符串?dāng)?shù)據(jù)。printf(”token macro is %s”, __stringify_1(a1));

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多