章节大纲

  • <string.h> – 字符串处理(String Handling)

    C 语言的实现可以自由地对任何数据类型施加特定的内存对齐要求。因此,当你复制一个已对齐的对象到内存中时,你必须保证目标副本的对齐同样满足要求。
    否则,复制出的对象可能无法访问被错误解释

    这意味着:程序员必须确保复制后的对象既符合格式,又处于可正确使用的内存位置。

    标准 C 保留所有以 strmemwcs 开头、后跟小写字母的函数名,以供将来在本头文件中添加更多函数。

    参见附录内容:C11 的“边界检查接口”可能要求实现向该头文件添加更多内容。

    C++ 注意事项:对应标准 C++ 头文件为 <cstring>


    复制函数(Copying Functions)

    memcpy 函数

    • 如果两个内存块重叠,行为未定义

    memmove 函数

    • C89 引入。

    • memcpy 不同,它可以处理重叠内存区域

    strcpy 函数

    • 若源字符串与目标字符串重叠,行为未定义

    strncpy 函数

    • 同样,重叠行为未定义


    拼接函数(Concatenation Functions)

    strcat 函数

    • 若两个字符串重叠,行为未定义

    strncat 函数

    • 同样,重叠行为未定义


    比较函数(Comparison Functions)

    建议:
    所有比较函数都会返回一个整数,表示:

    • 小于 0:前者小于后者

    • 等于 0:相等

    • 大于 0:前者大于后者

    切勿假设返回值的具体正负值具有特定含义,应只与 0 作比较,而不是特定非零值。

    strcoll 函数

    • 比较方式依赖当前区域设置(locale)

    • C89 引入。

    strxfrm 函数

    • C89 引入,用于字符串转换,便于按 strcoll 的方式比较。

    strstr 函数

    • C89 引入,用于查找子字符串。


    其他函数(Miscellaneous Functions)

    strerror 函数

    • 返回的错误信息内容为实现定义

    • 不要尝试修改其返回的字符串内容。


    <tgmath.h> – 类型泛化数学函数(Type-Generic Math)

    该头文件由 C99 引入,用于在不指定具体类型的情况下调用 math.hcomplex.h 中的函数(即允许编译器根据实参类型自动选择对应的版本,如 floatdoublelong double)。

    C++ 注意事项:对应 C++ 头文件为 <ctgmath>,但在 C++17 中已被弃用


    <threads.h> – 线程支持(Threads)

    该头文件由 C11 引入。

    如果某个实现支持关键字 _Thread_local(可通过宏 __STDC_NO_THREADS__ 判断),则它也会提供 <threads.h> 头文件。

    因此,你应使用如下方式启用线程局部存储:

    #include <threads.h>
    
    void f() {
        thread_local static int tlsI = 0;
        …
    }
    

    其中,thread_local<threads.h> 中定义的宏,映射为 _Thread_local,也与 C++ 中的同名关键字一致。

    标准 C 保留所有以以下前缀开头、后跟小写字母的名称,用于在本头文件中未来扩展:

    • 函数名:cnd_mtx_thrd_tss_

    • 类型名和枚举常量也遵循上述命名规则

    C++ 注意事项:标准 C++ 没有对应的头文件