C语言中的#和##

#是在宏定义中将参数进行字符串化的预处理特征,例如:ios

#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;
}

  这样能够把不一样变量的值和名称打印出来,上面的例子显示为:this

a:123
f:123.456
23:23spa

##是链接符,例如:blog

#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等端口时,使用这种方式就比较方便了。io

 

注意:编译

当宏参数是另外一个宏的时候,须要注意的是,凡宏定义里有用’#’或’##’的地方宏参数是不会再展开,看下面的例子:class

#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 scopestream

固然,更不要幻想使用宏定义肯定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;
}

  报出的错误是相同的。

预处理的替换,只会作最简单的浅层替换,而不会去考虑这个字符串是从哪里来的

相关文章
相关标签/搜索