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

分享

#define命令的一些高級用法

 thchen0103 2017-02-03

===========================================================
define中的三個特殊符號:#,##,#@
===========================================================
  1. #define Conn(x,y) x##y
  2. #define ToChar(x) #@x
  3. #define ToString(x) #x
(1)x##y表示什么?表示x連接y,舉例說:
  1. int n = Conn(123,456); /* 結(jié)果就是n=123456;*/
  2. char* str = Conn("asdf", "adf"); /*結(jié)果就是 str = "asdfadf";*/
(2)再來看#@x,其實(shí)就是給x加上單引號,結(jié)果返回是一個const char。舉例說:
char a = ToChar(1);結(jié)果就是a='1';
做個越界試驗(yàn)char a = ToChar(123);結(jié)果就錯了;
但是如果你的參數(shù)超過四個字符,編譯器就給給你報錯了!
error C2015: too many characters in constant   :P
(3)最后看看#x,估計你也明白了,他是給x加雙引號
char* str = ToString(123132);就成了str="123132";

===========================================================
常用的一些宏定義
===========================================================

1 防止一個頭文件被重復(fù)包含 
  1. #ifndef BODYDEF_H 
  2. #define BODYDEF_H 
  3.  //頭文件內(nèi)容 

  4. #endif
2 得到指定地址上的一個字節(jié)或字
  1. #define MEM_B( x ) ( *( (byte *) (x) ) ) 
  2. #define MEM_W( x ) ( *( (word *) (x) ) )
用法如下:
  1. #include <iostream>
  2. #include <windows.h>

  3. #define MEM_B(x) (*((byte*)(x)))
  4. #define MEM_W(x) (*((WORD*)(x)))

  5. int main()
  6. {
  7.     int bTest = 0x123456;

  8.     byte m = MEM_B((&bTest));/*m=0x56*/
  9.     int n = MEM_W((&bTest));/*n=0x3456*/

  10.     return 0;
  11. }
3 得到一個field在結(jié)構(gòu)體(struct)中的偏移量
  1. #define OFFSETOF( type, field ) ( (size_t) &(( type *) 0)-> field )
4 得到一個結(jié)構(gòu)體中field所占用的字節(jié)數(shù) 
  1. #define FSIZ( type, field ) sizeof( ((type *) 0)->field )
5 得到一個變量的地址(word寬度) 
  1. #define B_PTR( var ) ( (byte *) (void *) &(var) ) 
  2. #define W_PTR( var ) ( (word *) (void *) &(var) )
6 將一個字母轉(zhuǎn)換為大寫
  1. #define UPCASE( c ) ( ((c) >= ''a'' && (c) <= ''z'') ? ((c) - 0x20) : (c) )
7 判斷字符是不是10進(jìn)值的數(shù)字
  1. #define DECCHK( c ) ((c) >= ''0'' && (c) <= ''9'')
8 判斷字符是不是16進(jìn)值的數(shù)字 
  1. #define HEXCHK( c ) ( ((c) >= ''0'' && (c) <= ''9'') ||((c) >= ''A'' && (c) <= ''F'') ||((c) >= ''a'' && (c) <= ''f'') )
9 防止溢出的一個方法
  1. #define INC_SAT( val ) (val = ((val)+> (val)) ? (val)+: (val))
10 返回數(shù)組元素的個數(shù) 
  1. #define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )
11 使用一些宏跟蹤調(diào)試
在調(diào)試時,我們可以設(shè)置__DEBUG宏,也可以再M(fèi)akefile中使用-D編譯選項(xiàng)設(shè)置,
  1. #define __DEBUG  
使用方法為,
  1. #ifdef __DEBUG  
  2. printf("%s", ...);  
  3. #endif  

另外,ANSI C標(biāo)準(zhǔn)中有幾個標(biāo)準(zhǔn)預(yù)定義宏,前面幾個(func...STDC)常用于printf(sprintf)等語句中:

__func__:在源代碼中插入當(dāng)前所在函數(shù)名;

__LINE__:在源代碼中插入當(dāng)前源代碼行號;

__FILE__:在源文件中插入當(dāng)前源文件名;

__DATE__:在源文件中插入當(dāng)前的編譯日期

__TIME__:在源文件中插入當(dāng)前編譯時間;

__STDC__:當(dāng)要求程序嚴(yán)格遵循ANSI C標(biāo)準(zhǔn)時該標(biāo)識被賦值為1;

__cplusplus:當(dāng)編寫C++程序時該標(biāo)識符被定義。

其中__cplusplus常用于頭文件中,格式如下:

  1. #ifndef _ZX_FUNC_H  
  2. #define _ZX_FUNC_H  
  3.   
  4. #ifdef __cplusplus  
  5. extern "C" {  
  6. #endif  
  7.   
  8. /* functions */  
  9. char *strdup (const char *s);  
  10.   
  11. #ifdef __cplusplus  
  12. }  
  13. #endif  
  14.   
  15. #endif  

extern"C"表示將其中的代碼按照C編譯方法編譯,目的是實(shí)現(xiàn)C++與C語言的調(diào)用。

C編譯與C++編譯的區(qū)別是:C會將上面strdup編譯成_STRDUP符號,而C++會編譯成_STRDUP_CHAR,這也是C++為什么能實(shí)現(xiàn)函數(shù)重載的原因。extern只能出現(xiàn)在C++文件中,一般如上面的方式置于頭文件中。

要在C中調(diào)用C++代碼,需要在C代碼中的函數(shù)或變量聲明為extern類型,在C++中將函數(shù)或變量用extern "C"修飾。


12 簡單數(shù)學(xué)計算(絕對值,三角函數(shù)等)

  1. #define ABS( a ) ( ((a)>0) ? (a) : (-(a)) )  


13 #define 一個復(fù)雜語句

比如交換a,b的值,

  1. #define(a,b) do { \  
  2.     int t = 0;  
  3.     t = a; \  
  4.     a = b; \  
  5.     b = t; \  
  6. } while(0)  


注:#define的這些高級用法在Linux源代碼很多處出現(xiàn),可閱讀參考Linux源代碼。



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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多