关键词不能为空

当前您在: 主页 > 英语 >

CC++ 中(两个井号)和(一个井号)用法

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-09 22:27
tags:

-

2021年2月9日发(作者:measure)


C/C++



##(


两个井号


)



#(

一个井号


)


用法



##(


两个井号


)



#(


一个井号


)


都是什 么意思



连接符



##(


两个井号


)


不知道什么符



#(


一个井号


)


##


连接符号由两个井号组成,其功能是在带参数的宏定义中 将两个子串


(token)


联接起来,


从而形成一个新的子串。


但它不可以是第一个或者最后一个子串。


所谓的子串


(token)


就是指


编 译器能够识别的最小语法单元。具体的定义在编译原理里有详尽的解释



#


符是把传递过来的参数当成字符串进行替代。



假设程序中已经定义了这样一个带参数的宏:



#define PRINT( n ) printf(



同时又定义了二个整形变量:



int token9 = 9;


现在在主程序中以下面的方式调用这个宏:



PRINT( 9 );


那么在编译时,上面的这句话被扩展为:



printf(


注意到在这个例子中,


PRINT(9);


中的这个


”9”


被原封不动的当成了一个字符串,与


”token”


连接在了一 起,从而成为了


token9


。而


#n


也被


”9”


所替代。

< br>


可想而知,上面程序运行的结果就是在屏幕上打印出



token9=9



还有点不明白


?!


再来一个例子


:


#define PRINT( n ) printf(



int token9 = 9;


int game9 = 99;


调用


:


PRINT(9);


屏幕上打印出


:


token9 = 99



///////////////////////// ////////////////////////////////////////////////// ///////////////////////////


//////////// ////////////////////////////////////////////////// ////////////////////////////////////////



C++



##(

< br>两个井号


)



#(


一个井号


)


用法(转)



C


(和


C++


)中的宏(


Macro


)属于编译器预处理的范畴,属于编译期 概念(而非运行期概


念)。下面对常遇到的宏的使用问题做了简单总结。







#



##




C


语言的 宏中,


#


的功能是将其后面的宏参数进行字符串化操作(


Stringfication


),简单


说就 是在对它所引用的宏



变量通过替换后在其左右各加上一个双引 号。比如下面代码中的


宏:




#define WARN_IF(EXP)



do{ if (EXP)



fprintf(stderr,



while(0)



那么实际使用中会出现下面所示的替换过程:




WARN_IF (divider == 0);




被替换为





do {



if (divider == 0)



fprintf(stderr,



} while(0);



这样每次


divider


(除数)为


0


的时候便会在标



准错误流上输出一个提示信息。



< /p>



##


被称为连接符


concatenator




用来将两个


Token


连接为一个


Token



注意这里连

< br>



的对象是


Token


就行,而不一定是宏的变量。比如你要做一个菜单项命令名和函数指针组


成的结构体的数组,并且希望在函数名和菜单项命令名之间有直观


< br>的、名字上的关系。那


么下面的代码就非常实用:




struct command



{



char * name;



void (*function) (void);



};




#define COMMAND(NAME) { NAME, NAME ## _command }




// < /p>


然后你就用一些预先定义好的命令来方便的初始化一个


comma nd


结构的数组了:





struct command commands[] = {



COMMAND(quit),



COMMAND(help),



...



}



COMMAND


宏在这里充当一个代 码生成器的作用,这样可以在一定程度上减少代码密度,


间接地也可


以减少不留心所造成的错误。我们还可以


n



##


符号连接



n+1



Token


, 这


个特性也是


#


符号所不具备的。比如 :




#define LINK_MULTIPLE(a,b,c,d) a##_##b##_##c##_##d




typedef struct _record_type LINK_MULTIPLE(name,company,position,salary);



//


这里这个语句将展开为:




// typedef struct _record_type name_company_position_salary;


< br>关于


...


的使用




...



C


宏中称为


Variadic Macro


,也就是变参宏。比如:




#define myprintf(templt,...) fprintf(stderr,templt,__VA_ARGS__)




//


或者





#define myprintf(templt,args...) fprintf(stderr,templt,args)



第一个宏中由于没有对变



参起名,< /p>


我们用默认的宏


__VA_ARGS__


来替代它。


第二个宏中,


我们显式地命名变参为


args


,那么我们在宏定义中就可以用


args


来代指变参了。




C



言的


stdcall

< p>
一样,变参必须作为参数表的最有一项出现。当上面的宏中我们只能提供第一


个参数


templt


时,


C


标准要求我们必须写成:




myprintf(templt,);





形式。这时的替换过程为:




myprintf(


-


-


-


-


-


-


-


-



本文更新与2021-02-09 22:27,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/624453.html

CC++ 中(两个井号)和(一个井号)用法的相关文章

  • 余华爱情经典语录,余华爱情句子

    余华的经典语录——余华《第七天》40、我不怕死,一点都不怕,只怕再也不能看见你——余华《第七天》4可是我再也没遇到一个像福贵这样令我难忘的人了,对自己的经历如此清楚,

    语文
  • 心情低落的图片压抑,心情低落的图片发朋友圈

    心情压抑的图片(心太累没人理解的说说带图片)1、有时候很想找个人倾诉一下,却又不知从何说起,最终是什么也不说,只想快点睡过去,告诉自己,明天就好了。有时候,突然会觉得

    语文
  • 经典古训100句图片大全,古训名言警句

    古代经典励志名言100句译:好的药物味苦但对治病有利;忠言劝诫的话听起来不顺耳却对人的行为有利。3良言一句三冬暖,恶语伤人六月寒。喷泉的高度不会超过它的源头;一个人的事

    语文
  • 关于青春奋斗的名人名言鲁迅,关于青年奋斗的名言鲁迅

    鲁迅名言名句大全励志1、世上本没有路,走的人多了自然便成了路。下面是我整理的鲁迅先生的名言名句大全,希望对你有所帮助!当生存时,还是将遭践踏,将遭删刈,直至于死亡而

    语文
  • 三国群英单机版手游礼包码,三国群英手机单机版攻略

    三国群英传7五神兽洞有什么用那是多一个武将技能。青龙飞升召唤出东方的守护兽,神兽之一的青龙。玄武怒流召唤出北方的守护兽,神兽之一的玄武。白虎傲啸召唤出西方的守护兽,

    语文
  • 不收费的情感挽回专家电话,情感挽回免费咨询

    免费的情感挽回机构(揭秘情感挽回机构骗局)1、牛牛(化名)向上海市公安局金山分局报案,称自己为了挽回与女友的感情,被一家名为“实花教育咨询”的情感咨询机构诈骗4万余元。

    语文