程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++中的#,##,和"

C++中的#,##,和"

編輯:C++入門知識

C++中的#,##,和"


本文主頁鏈接:C++中的#,##,和"


想要靈活應用宏,離不開###

"

在學習###之前,先來看一個關於"的例子:

#include 
#include 

int main()
{
    const char* p1 = "Hello," "World!";     // 一個空格
    const char* p2 = "Hello,"    "World!";  // 多個空格
    const char* p3 = "Hello,""World!";      // 沒有空格
    const char* p4 = "Hello,World!";        // 一個整串
    const char* p5 = "Nihao,""Shijie!";  // 一個不同的串

    printf("p1 = %s, strlen(p1) = %d\n", p1, strlen(p1));
    printf("p2 = %s, strlen(p2) = %d\n", p2, strlen(p2));
    printf("p3 = %s, strlen(p3) = %d\n", p3, strlen(p3));
    printf("p4 = %s, strlen(p4) = %d\n", p4, strlen(p4));
    printf("p5 = %s, strlen(p5) = %d\n", p5, strlen(p5));

    return 0;
}

輸出為:

p1 = Hello,World!, strlen(p1) = 12
p2 = Hello,World!, strlen(p2) = 12
p3 = Hello,World!, strlen(p3) = 12
p4 = Hello,World!, strlen(p4) = 12
p5 = Nihao,Shijie!, strlen(p5) = 13

查看PE文件的常量字符串段,發現經過編譯器優化後只存在一個Hello,World!串。
\

即p1,p2,p3,p4這四種寫法是等價的,這一點作為之後解釋#用法的前提。

字符串化操作(#)

當用作字符串化操作時,#的主要作用是將宏參數不經擴展地轉換成字符串常量。
要點:

    宏定義參數的左右兩邊的空格會被忽略,參數的各個Token之間的多個空格會被轉換成一個空格。
    宏定義參數中含有需要特殊含義字符如"\時,它們前面會自動被加上轉義字符\

    還是通過MSDN上的例子來看看容易懂:

    #define F abc
    #define B def
    #define FB(arg) #arg
    #define FB1(arg) FB(arg)
    
    FB(F B)
    FB1(F B)
    

    初看到時推測這兩行預編譯出來後效果是一樣的,但是看了使用gcc -E編譯出來代碼,這才理解了MSDN上對“不經擴展”有了更深刻的理解,實際的預編譯後代碼為:

    "F B";
    "abc def";
    

    推測變換過程應該如下:

    FB(F B) --> #F B -->"F B"  
    FB1(F B) --> FB1(abc def) --> FB(abc def) --> #abc def --> "abc def"
    

    標記連接操作(##)

    將多個Token連接成一個Token。
    要點:

      它不能是宏定義中的第一個或最後一個Token。
      前後的空格可有可無。

      來理解一下MSDN上舉的例子:

      #include 
      #define paster( n ) printf_s( "token" #n " = %d", token##n )
      int token9 = 9;
      
      int main()
      {
         paster(9);
      }
      

      paster(9);的預處理步驟應該如下:

        paster(9);
        printf_s( "token" #9 " = %d", token##9 );
        printf_s( "token" "9" " = %d", token9 );
        printf_s( "token9 = %d", token9 );

        這樣應該就很好理解了。

        參考MSDN

          Stringizing Operator(#) : http://msdn.microsoft.com/EN-US/library/7e3a913x(v=VS.110,d=hv.2).aspx
          Token-Pasting Operator(##) : http://msdn.microsoft.com/EN-US/library/09dwwt6y(v=VS.110,d=hv.2).aspx

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved