久久久久久久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)--得出結論是:##的作用之一是將前后兩個宏參數連在一起!

關閉窗口

相關文章

主站蜘蛛池模板: 成人午夜视频在线观看 | 欧美一区二区在线播放 | 日韩免费毛片 | 中文字幕在线观看一区 | 精品乱子伦一区二区三区 | 999av| 黄网站视频 | 欧美日韩国产一区二区 | 中文字幕第三页 | 夜夜嗨av一区二区三区 | 中国一级黄色录像 | 日本伊人网 | 日韩一级黄色片 | 免费黄色片视频 | 亚洲国产欧美日韩在线 | av日韩在线播放 | 老女人丨91丨九色 | 日韩久久久久久 | 国产精品一区二区av | 美日韩一区 | 99热网站 | 日本不卡一区 | 国产一区二区三区在线观看视频 | 久久久综合 | 青久久 | 97视频网站 | 六月婷婷综合 | 在线看的av | 色伊人网| 欧美一级久久 | 久久伊人精品 | 久久riav | 国产小视频在线观看 | 日韩有码av | 天天操免费视频 | 亚洲天堂色图 | 中文天堂在线观看 | 成年人小视频 | 久久精品黄色 | 欧美日韩国产中文 | 超碰91在线 |