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

  • 相关阅读:
    台湾大学李宏毅机器学习教程
    自编码器AE & 变分自编码器VAE
    深度信念网络(DBN)和堆叠自编码(SAE)、深度自编码器(DAE)的区别
    花式自动编码器
    迁移和域自适应
    MMD :maximum mean discrepancy
    数据可视化工具t-SNE
    线性判别分析(LDA)
    弱监督学习
    如何生成不重复的随机数
  • 原文地址:https://www.cnblogs.com/3me-linux/p/5825940.html
Copyright © 2011-2022 走看看