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

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

C語言中##的用法

作者:huqin   來源:本站原創   點擊數:  更新時間:2014年04月10日   【字體:
今天看linux操作系統源碼是有這么一段:
                                        #define _syscall0(type,name) \
                                        type name(void) \
                                        { \
                                        long __res; \
                                        __asm__ volatile ( "int $0x80" \ // 調用系統中斷0x80。
                                        :"=a" (__res) \ // 返回值??eax(__res)。
                                        :"" (__NR_
                                        ##name)); \ // 輸入為系統中斷調用號__NR_name。
                                         if (__res >= 0) \ // 如果返回值>=0,則直接返回該值。
                                          return (type) __res; errno = -__res; \ // 否則置出錯號,并返回-1。
                                          return -1;} 
其中有一個地方出現了兩個‘#’號不明白什么意思,網上找到了一段論壇:
     
 宏中"#"和"##"的用法 

一、一般用法 
我們使用#把宏參數變為一個字符串,用##把兩個宏參數貼合在一起. 
用法: 
#include<cstdio> 
#include<climits> 
using namespace std; 

#define STR(s)     #s 
#define CONS(a,b)  int(a##e##b) 

int main() 

    printf(STR(vck));           // 輸出字符串"vck" 
    printf("%d 
", CONS(2,3));  // 2e3 輸出:2000 
    return 0; 


二、當宏參數是另一個宏的時候 
需要注意的是凡宏定義里有用'#'或'##'的地方宏參數是不會再展開. 

1, 非'#'和'##'的情況 
#define TOW      (2) 
#define MUL(a,b) (a*b) 

printf("%d*%d=%d 
", TOW, TOW, MUL(TOW,TOW)); 
這行的宏會被展開為: 
printf("%d*%d=%d 
", (2), (2), ((2)*(2))); 
MUL里的參數TOW會被展開為(2). 

2, 當有'#'或'##'的時候 
#define A          (2) 
#define STR(s)     #s 
#define CONS(a,b)  int(a##e##b) 

printf("int max: %s 
",  STR(INT_MAX));    // INT_MAX #include<climits> 
這行會被展開為: 
printf("int max: %s 
", "INT_MAX"); 

printf("%s 
", CONS(A, A));               // compile error  
這一行則是: 
printf("%s 
", int(AeA)); 

INT_MAX和A都不會再被展開, 然而解決這個問題的方法很簡單. 加多一層中間轉換宏. 
加這層宏的用意是把所有宏的參數在這層里全部展開, 那么在轉換宏里的那一個宏(_STR)就能得到正確的宏參數. 

#define A           (2) 
#define _STR(s)     #s 
#define STR(s)      _STR(s)          // 轉換宏 
#define _CONS(a,b)  int(a##e##b) 
#define CONS(a,b)   _CONS(a,b)       // 轉換宏 

printf("int max: %s 
", STR(INT_MAX));          // INT_MAX,int型的最大值,為一個變量 #include<climits> 
輸出為: int max: 0x7fffffff 
STR(INT_MAX) -->  _STR(0x7fffffff) 然后再轉換成字符串; 

printf("%d 
", CONS(A, A)); 
輸出為:200 
CONS(A, A)  -->  _CONS((2), (2))  --> int((2)e(2)) 

三、'#'和'##'的一些應用特例 
1、合并匿名變量名 
#define  ___ANONYMOUS1(type, var, line)  type  var##line 
#define  __ANONYMOUS0(type, line)  ___ANONYMOUS1(type, _anonymous, line) 
#define  ANONYMOUS(type)  __ANONYMOUS0(type, __LINE__) 
例:ANONYMOUS(static int);  即: static int _anonymous70;  70表示該行行號; 
第一層:ANONYMOUS(static int);  -->  __ANONYMOUS0(static int, __LINE__); 
第二層:                        -->  ___ANONYMOUS1(static int, _anonymous, 70); 
第三層:                        -->  static int  _anonymous70; 
即每次只能解開當前層的宏,所以__LINE__在第二層才能被解開; 

2、填充結構 
#define  FILL(a)   {a, #a} 

enum IDD{OPEN, CLOSE}; 
typedef struct MSG{ 
  IDD id; 
  const char * msg; 
}MSG; 

MSG _msg[] = {FILL(OPEN), FILL(CLOSE)}; 
相當于: 
MSG _msg[] = {{OPEN, "OPEN"}, 
              {CLOSE, "CLOSE"}}; 

3、記錄文件名 
#define  _GET_FILE_NAME(f)   #f 
#define  GET_FILE_NAME(f)    _GET_FILE_NAME(f) 
static char  FILE_NAME[] = GET_FILE_NAME(__FILE__); 

4、得到一個數值類型所對應的字符串緩沖大小 
#define  _TYPE_BUF_SIZE(type)  sizeof #type 
#define  TYPE_BUF_SIZE(type)   _TYPE_BUF_SIZE(type) 
char  buf[TYPE_BUF_SIZE(INT_MAX)]; 
     -->  char  buf[_TYPE_BUF_SIZE(0x7fffffff)]; 
     -->  char  buf[sizeof "0x7fffffff"]; 
這里相當于: 
char  buf[11];
 自己在linux下編寫了一段程序:
#include<stdio.h>
#define transform 1##2##3
int main()
{
    int result=transform*transform;
    printf("the num of result is : %d",result);
    return 0;

函數輸出的結果是 15129(=123*123)--得出結論是:##的作用之一是將前后兩個宏參數連在一起!

關閉窗口

相關文章

主站蜘蛛池模板: 欧美黑人又粗大 | 国产1区2区| 色在线免费视频 | 国产成人精品一区二区三区四区 | 日韩精品在线观看一区二区三区 | 国产精品久久久久久 | 国产最新网址 | 欧美在线日韩 | 91精品国产综合久久久久久丝袜 | 亚洲欧美成人影院 | 国产精品久久久久免费 | 国户精品久久久久久久久久久不卡 | 伊人影院在线观看 | 成人精品一区二区三区 | 精品视频一区二区三区 | 国产日产欧产精品精品推荐蛮挑 | 黄色福利 | 99reav| 中文字幕亚洲区 | 亚洲欧美中文日韩在线v日本 | 久久国产精品久久久久久 | 亚洲国产一区在线 | 亚洲精品电影在线 | 色狠狠一区 | 国产一区二区自拍 | 亚洲福利网 | 91在线免费观看 | 91精品久久 | ririsao久久精品一区 | 激情欧美一区二区三区 | 亚洲国产成人一区二区 | 蜜桃传媒一区二区 | 国产精品永久免费视频 | 欧美aa在线| 国产精品一区二区三区四区 | 国产欧美日韩一区 | 男女免费观看在线爽爽爽视频 | 91爱啪啪 | 精品美女 | 日本精品999 | 日韩久久久一区二区 |