zoukankan      html  css  js  c++  java
  • c语言中宏定义#和 ##的作用:

    转载:http://www.cnblogs.com/cyttina/archive/2013/05/11/3072969.html

    看了这篇文章后了解了,但是文章中的例子比较特别,我在这里加个注释好了。

    http://www.cnblogs.com/welkinwalker/archive/2012/03/30/2424844.html


    单井号就是将后面的 宏参数 进行字符串操作,就是将后面的参数用双引号引起来

    双井号就是用于连接。

    比如文章中的例子:

    #define PRINT(NAME) printf("token"#NAME"=%d ", token##NAME)

    调用时候使用: PRINT(9);
    宏展开即为: printf("token"#9"=%d ",token##9);
    #9即为"9",token##9即为: token9
    整个为: printf("token""9""=%d ",token9);
    之前定义过token9为9,所以就是输出 token9=9;


    解释到这里应该就明白单#和双#怎么用了。附上代码,还是摘自上面的连接。

     1 #include <iostream>
     2 void quit_command(){
     3     printf("I am quit command
    ");
     4 }   
     5 void help_command(){
     6     printf("I am help command
    ");
     7 }   
     8 struct command
     9 {
    10     char * name;
    11     void (*function) (void);
    12 };  
    13 #define COMMAND(NAME) {#NAME,NAME##_command}
    14 #define PRINT(NAME) printf("token"#NAME"=%d
    ", token##NAME)
    15 main(){
    16     int token9=9;
    17     PRINT(9);
    18     struct command commands[] = {
    19         COMMAND(quit),
    20         COMMAND(help),
    21     };  
    22     commands[0].function();
    23 }

    代码中还有一点就是调用那个函数指针的部分。解释一下,COMMAND宏定义是有{}的,第一个#NAME,就是赋值给结构体command的char *name,第二个 NAME##_command,用来拼出函数名,赋值给结构体中的函数指针,之后在commands[0].function()中通过函数指针来调用函数。

  • 相关阅读:
    太tmd恐怖了,一个搞破解的过程分析。
    JQuery爱好者们的福音:jQuery EasyUI 开源插件套装 完全替代ExtJS
    期待5月的灿烂阳光
    2010 2月记
    JQuery 的跨域方法 可跨任意网站
    准备写个ASP.NET MVC 2开发的系列文章
    Win7 访问网络共享文件夹显示空白目录的问题解决
    4月的长沙
    将ASP.NET MVC 2.0 部署在IIS6和IIS7上的教程
    谈谈年底感想
  • 原文地址:https://www.cnblogs.com/3me-linux/p/5825940.html
Copyright © 2011-2022 走看看