栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C语言】#和##的作用

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C语言】#和##的作用

C语言宏中#的功能是将其后面的宏参数进行字符串化操作(Stringizing operator),简单说就是在它引用的宏变量的左右各加上一个双引号。

如定义好#define STRING(x) #x之后,下面二条语句就等价。
 

char *pChar = "hello";
char *pChar = STRING(hello);

##它可以拼接符号(Token-pasting operator),如:

#define paster( n ) printf( "token"#n" = %dn", token##n )
int token9 = 100;


再调用 paster(9);宏展开后token##n直接合并变成了token9。
整个语句变成了

printf( "token""9"" = %d", token9 );


在C语言中字符串中的二个相连的双引号会被自动忽略,于是上句等同于
printf("token9 = %d", token9);。
即输出token9 = 100

下面是我的具体测试代码,

#include 
#define test(a) printf("tt"#a"=%dn",n1##a)

#define DEBUG_LOG(fmt,level,args...) printf("DEBUG_"#level":"#fmt"n",##args)

int log_level = 0;
// #fmt 为将输入的参数 fmt改为 字符串输出 
//  fmt 是传入什么参数打印什么参数
// ## 是为了拼接1个参数  实际我感觉在此处用处不大,如果有知道的可以提示下,谢谢。
#define debug_log_printf(fmt,level,args...) 
do
{
    if(level == log_level)
        printf("DEBUG_"#level"[%s]"fmt"n",__FUNCTION__,args) ;
}while(0)
//__VA_ARGS__ 是一个可变参数的宏  ,意思是后面加几个参数都行
#define debug_log_printf1(fmt,level,...) 
do
{
    if(level == log_level)
        printf("DEBUG_"#level"[%s]"fmt"n",__FUNCTION__,##__VA_ARGS__) ;
}while(0)

void printf_test_fun(int n1ccb,int ccb)
{
    int num = 199;
    char str_test[] = "test_printf";
    test(ccb);
    DEBUG_LOG("n1ccb is %d",5,n1ccb);
    debug_log_printf("cc1b is %d",0,ccb);
    debug_log_printf1("n1ccb = %d num = %d %s",0,n1ccb,num,str_test);    
}
int main(void)
 {
    int n1ccb = 100;
    int ccb =88;
    printf("Hello Worldn");
    printf_test_fun(n1ccb,ccb);
    return 0;
    
}

如果有朋友有更好的见解或者我的代码中有问题,欢迎讨论和指出,谢谢。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1019267.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号