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

關閉窗口

相關文章

主站蜘蛛池模板: 精品一区二区三区不卡 | 久久久久久久一区二区三区 | 午夜av在线| 国产不卡视频在线 | 久久久久久久久久久高潮一区二区 | av国产精品毛片一区二区小说 | 人妖av| aaaaa毛片| 久久久免费电影 | 国内精品久久影院 | 日韩欧美精品 | 99国产精品久久久 | 激情小视频| 亚洲一区二区三区四区五区中文 | 亚洲午夜在线 | 99久久免费精品 | 久久成人免费视频 | 久久综合一区二区三区 | 国产不卡一区在线观看 | 华丽的挑战在线观看 | 欧美激情区 | 91传媒在线观看 | 免费 视频 1级 | 国产99久久精品一区二区300 | 日韩福利一区 | 日韩高清中文字幕 | 亚洲精品一区二区 | 热久久999| 久久久久久国产精品久久 | 成人av免费| 成人免费视频网站在线观看 | 中文字幕一区在线 | 亚洲 中文 欧美 日韩 在线观看 | 久久国产精品99久久久久久丝袜 | 久久久一区二区 | 日韩不卡一区二区 | 91麻豆精品一区二区三区 | wwwxxx国产 | 在线播放日韩 | 久热久热 | 国产免费让你躁在线视频 |