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()中通过函数指针来调用函数。

  • 相关阅读:
    使用别名(CName)记录免费将顶级域名解析到动态IP上
    DataTable 排序
    VS2005中使用MySQL 5.0
    让VS2005用起来更顺手
    PowerBuilder 9.0 Datawindow 导出 pdf 文件
    使用WebClient自动填写并提交ASP.NET页面表单的源代码
    C#中使用条件运算符 (?:)
    如何申请 @msn.com 邮箱
    遇上你是我的缘[转]
    Linux也玩远程桌面(VNC)
  • 原文地址:https://www.cnblogs.com/3me-linux/p/5825940.html
Copyright © 2011-2022 走看看