zoukankan      html  css  js  c++  java
  • C

    宏列表

    在Mozilla的代码中常常用到。

    可以方便地重用标识符列表。

    #define FLAG_LIST(_)                   
        _(InWorklist)                      
        _(EmittedAtUses)                   
        _(LoopInvariant)                   
        _(Commutative)                     
        _(Movable)                         
        _(Lowered)                         
        _(Guard)
    

    FLAG_LIST的参数是一个宏,它将被依次调用与列表中的每一个标识符。

    类型

    #define DEFINE_FLAG(flag) flag,
       enum Flag {
           None = 0,
           FLAG_LIST(DEFINE_FLAG)
           Total
       };
    #undef DEFINE_FLAG
    

    操作

    #define FLAG_ACCESSOR(flag) 
    bool is##flag() const {
        return hasFlags(1 << flag);
    }
    void set##flag() {
        JS_ASSERT(!hasFlags(1 << flag));
        setFlags(1 << flag);
    }
    void setNot##flag() {
        JS_ASSERT(hasFlags(1 << flag));
        removeFlags(1 << flag);
    }
     
    FLAG_LIST(FLAG_ACCESSOR)
    #undef FLAG_ACCESSOR
    

    指定初始化

    数组

    /* Entries may not correspond to actual numbers. Some entries omitted. */
    #define EINVAL 1
    #define ENOMEM 2
    #define EFAULT 3
    /* ... */
    #define E2BIG  7
    #define EBUSY  8
    /* ... */
    #define ECHILD 12
    /* ... *
    
    
    char *err_strings[] = {
     	     [0] = "Success",
    	[EINVAL] = "Invalid argument",
    	[ENOMEM] = "Not enough memory",
    	[EFAULT] = "Bad address",
    	/* ... */
    	[E2BIG ] = "Argument list too long",
    	[EBUSY ] = "Device or resource busy",
    	/* ... */
    	[ECHILD] = "No child processes"
    	/* ... */
    };
    

    结构体和联合体

    struct point {
    	int x;
    	int y;
    	int z;
    }
    
    struct point p = {.x = 3, .y = 4, .z = 5};
    

    联合体类似,但是只初始化一个字段。

    #if 0来注释代码

    #if 0
    ...
    #endif
    

    printf %m

    打印errno的出错内容。

    如果errno=0,输出Success

    没有类型的变量

    默认为int

    g;main(i){
       printf("g = %d, i = %d 
    ",g,i);
    }
    

    用宏来代替循环

    以下代码打印1~200。

    #include<stdio.h>
    #define STEP1 step();
    #define STEP2 STEP1 STEP1
    #define STEP4 STEP2 STEP2
    #define STEP8 STEP4 STEP4
    #define STEP16 STEP8 STEP8
    #define STEP32 STEP16 STEP16
    #define STEP64 STEP32 STEP32
    #define STEP128 STEP64 STEP64
    #define STEP256 STEP128 STEP128
    
    int n = 0;
    
    int step()
    {
           if (++n <= 200)
           printf("%d
    ", n);
    }
    
    int main()
    {
          STEP256;
          return 1;
    }
    

    结构体置0

    struct mystruct a = {0}; 
    

    把printf中的长度控制符放到参数里

    *

    #include <stdio.h>
    int main()
     {
       int a = 3;
       float b = 6.412355;
       printf("%.*f
    ",a,b);
       return 0;
    }
    

    scanf无视某个输入

    *

    char last[20];
    
    scanf("%*s %s", last);
    

    第一个参数会被忽略。如输入John Smith只会把Smith读到last里面。

    scanf扫描字符集

    %[...],输出到字符串,^代表扫描不在此字符集里的。

    char *a;
    /* .... */
    scanf("%[^,]", a);
    

    把逗号前的所有东西都读进来。

    scanf("%[^,],", a);
    

    把逗号前的所有东西都读进来,然后把缓冲区里的逗号吃掉。

    拷贝字符串

    while (*dest++ = *src++) ;
    
  • 相关阅读:
    thinkphp5ajax分頁&&搜索後分頁
    yii框架多文件上傳
    Redis:Linux安装与使用
    JSP使用Struts2标签库报错
    Dubbo:3
    Dubbo:1
    Dubbo:2
    zookeeper:master选举
    zookeeper:分布式锁简单实现(JavaApi)
    zookeeper:Curator操作节点
  • 原文地址:https://www.cnblogs.com/jt2001/p/6141683.html
Copyright © 2011-2022 走看看