C語言中的#和##


#是在宏定義中將參數進行字符串化的預處理特征,例如:

#include <iostream>

using namespace std;
#define P(EXP) cout<<#EXP<<":"<<EXP<<endl
int main()
{
    int a=123;
    float f=123.456;
    P(a);
    P(f);
    P(23);
    return 0;
}

  這樣可以把不同變量的值和名稱打印出來,上面的例子顯示為:

a:123
f:123.456
23:23

##是連接符,例如:

#include <iostream>
using namespace std;
#define V(x)  var##x
int main()
{
    int var1=123,var2=222,var3=321;
    printf("%d\n",V(1));
    printf("%d\n",V(2));
    printf("%d\n",V(3));
    return 0;
}

  顯示為:

123
222
321

這個例子可能不是太好,感覺很雞肋,不過在很多的嵌入式開發中,有很多諸如GPIOA、GPIOB等端口時,使用這種方式就比較方便了。

 

注意:

當宏參數是另一個宏的時候,需要注意的是,凡宏定義里有用’#’或’##’的地方宏參數是不會再展開,看下面的例子:

#include <iostream>
using namespace std;
#define V(x)  var##x
int main()
{
    int P=1;
    int var1=123,var2=222,var3=321;
    printf("%d\n",V(P));
    return 0;
}

  這段代碼無法通過編譯,報錯為:error: 'varP' was not declared in this scope

當然,更不要幻想使用宏定義確定P:

#include <iostream>
using namespace std;
#define V(x)  var##x
#define P   1
int main()
{

    int var1=123,var2=222,var3=321;
    printf("%d\n",V(P));
    return 0;
}

  報出的錯誤是相同的。

預處理的替換,只會做最簡單的淺層替換,而不會去考慮這個字符串是從哪里來的

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM