• C 常用库函数memset,编译器宏定义assert


    一、 总览

    1.1库函数

    函数名 头文件 功能 原型 说明
    syslog syslog.h 记录至系统记录(日志) void    syslog(int, const char *, ...) __printflike(2, 3) 参数1:优先级,参数2:要输出到系统日志的 参数3:(格式化)字符串
    perror stdio.h 将上个函数错误原因输出至stderr void     perror(const char *) 参数:要优先打印到stderr的字符串
    memset

     string.h

    /memory.h

     将指定内存区域全部设置为默认ASCII码值 void    *memset(void *, int, size_t)

    参数1:指定内存块指针

    参数2:字符ASCII码

    参数3:要初始化的内存前n个字节数

     bzero strings.h

    置字符串前n个字节=0,且包括'' ,

    已被舍弃,由memset取代;

    类似的有bcopy,bcmp等

    void     bzero(void *, size_t)

    参数1: 指定内存块指针

    参数2: 要初始化为0的内存前n个字节

    abort stdlib.h 引发程序不正常终止

    void     abort(void) __dead2

    #define __dead2        __attribute__((noreturn))

    无参数

    __attribute__((noreturn)) 表示希望自定义有返回值函数不想返回值

             
     宏定义  头文件  功能  原型  说明
     assert  assert.h

     断言,用于调试时判断表达式是否通过验证

    (真:通过;假:未通过)


    #define assert(e) 
        ((void) ((e) ? ((void)0) : __assert (#e, __FILE__, __LINE__)))
    #define __assert(e, file, line)
        ((void)printf ("%s:%u: failed assertion `%s' ", file, line, e), abort())

    e:表达式的值

    __FILE__:文件名

    __LINE__:当前代码行号

             
             
             

    1.2宏定义

    1)几个ANSI C标准定义的编译器内置宏

    __LINE__:在源代码中插入当前源代码行号;
    __FILE__:在源文件中插入当前源文件名;
    __DATE__:在源文件中插入当前的编译日期
    __TIME__:在源文件中插入当前编译时间;
    __STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1;
    __cplusplus:当编写C++程序时该标识符被定义。

    2.函数实现源码

    2.1 memset 常用于内存空间初始化

     1 /**
     2  *
     3  * 原型:void *memset(void *buffer, int c, int count);
     4  * 头文件:string.h 或memory.h
     5  * 功能:把buffer所指内存区域的前count个字节设置成字符c
     6  * 参数: buffer 要设置值的内存区域首地址指针
     7  *      c 字符ASCII码
     8  *      count 内存区域字节数
     9  * 返回值: 置成字符c后的内存区域首地址指针
    10  * 说明:返回指向buffer的指针。
    11  */
    12 void *memset(void *src, int c, size_t count)
    13 {
    14     assert(src != NULL);
    15     char *tmpSrc = (char *)src;
    16     while (count --) {
    17         *tmpSrc =(char)c;
    18         tmpSrc ++;
    19     }
    20     return src;
    21 }

     e.g 使用,如初始化一个结构体

    struct Grade
    {
        char name[30];
        int score;
    };
    
    struct Student
    {
        uint16_t id;
        char name[20];
        char sex;
        struct Grade grade;
    };
    
    //初始化 
    void init(){
        struct Student student;//开辟内存空间
        memset((void*)&student, 0, sizeof(struct Student));//结构体student所指向内存空间全部=(char)0//开辟内存空间
    }
  • 相关阅读:
    codeforces 19B Checkout Assistant DP
    bzoj1053: [HAOI2007]反素数ant [搜索]
    【2017泉州基地校集训】雷神领域[二分图][并查集]
    bzoj1433: [ZJOI2009]假期的宿舍 [二分图][二分图最大匹配]
    bzoj 1059: [ZJOI2007]矩阵游戏 [二分图][二分图最大匹配]
    二分图带权匹配-Kuhn-Munkres算法模板 [二分图带权匹配]
    luogu P1332 血色先锋队[bfs]
    匈牙利算法dfs模板 [二分图][二分图最大匹配]
    【2017泉州基地校集训】最优排名[贪心]
    最大流Dinic算法的一些优化 [网络流][最大流]
  • 原文地址:https://www.cnblogs.com/fortunely/p/4883937.html
Copyright © 2020-2023  润新知