The Standard C Library

【c++】fatal error C1189: #error: The C++ Standard Library forbids macroizing keywords. Enable warnin 文章摘要: 本文分析了关闭SSL校验的解决方法和安全风险,并提出了优化方案对比。关闭SSL校验能解决错误是因为跳过了证书验证步骤,但也带来中间人攻击、证书欺骗等安全风险。文章对比了两种优化方案:simple_ssl_optimization专注于连接复用避免SSL握手,而optimize_existing_ucauth采用多层重试机制。当前系统存在重试层级不足的问题,建议增加urllib3底层和应用层重试机制。总体建议在确保安全性的前提下进行SSL优化,避免因关闭校验导致安全隐患。 阅读详情

C的标志库函数是学习和使用C语言的基础,是编写经典C程序的基础,是学习其他计算机知识的基础.C标志库中一共包含了15个头文件:

<assert.h> <ctype.h> <stdio.h> <stdlib.h> <string.h> <limits.h> <float.h> <time.h>

<math.h> <setjmp.h> <signal.h> <stdarg.h> <stddef.h> <errno.h> <locale.h>

1:<assert.h>

NDEBUG

    NDEBUG宏是调试开关,当使用#include NDEBUG时程序为非调试状态,这种状态下调试宏assert不起作用。

assert

    调试宏assert只有在程序处于调试状态下才发挥作用,它的使用形式如下:assert(expression);当条件为假时会在屏幕中输出如下的调试信息:“Assertion failed:expression, file xyz, line nnn”,其中xyp是assert所在的文件名,nnn为assert在该文件中的位置。

assert宏还有许多用法,请参看《Writing Clean Code》第二章设计并使用断言。

 

2:<stdio.h>

<stdio.h>下面的类型,宏,函数都是分类的

其他:

    size_t sizeof返回的值

 

    NULL   空指针

文件:

    FILE   文件的类型

    fpos_t 文件中指针的位置

 

    EOF    文件末尾<0

    FILENAME_MAX  文件名最大值>0

    FOPEN_MAX     同时打开文件的最大值>8

    SEEK_SET      文件头

    SEEK_CUR       文件当前位置

    SEEK_END      文件末尾

 

打开文件

FILE *fopen(const char *filename,const char *mode);

    更改当前流相关的文件

    FILE *freopen(const char *filename,const char *mode,FILE *stream);

关闭文件

    int fclose(FILE *stream);

 

    清除流中的错误标志或文件末尾标志

    void clearerr(FILE *stream);

    测试流上的文件末尾标志

    int feof(FILE *stream);

    测试流上的错误标志

    int ferror(FILE *stream);

 

    将一个字符放回到流中

    int ungetc(int c, FILE *stream);

    从流中读一个字符

    int fgetc(FILE *stream);

    int getc(FILE *stream);/* 与fgetc相同但是可以用宏实现该函数 */

写一个字符到一个流

    int fputc(int c, FILE *stream);

    int putc(int c, FILE *stream);

    从流中获取一个字符串

    char *fgets(char *s, int n, FILE *stream);

    写一个字符串到一个流

    int fputs(const char *s, FILE *stream);

    打印一个格式化数据到一个流

    int fprintf(FILE *stream,const char *format, ...);

    使用一个参量列表指针格式化到流的数据

    int vfprintf(FILE *stream,const char *format, va_list ap);

    从一个流中读取格式化数据

    int fscanf(FILE *stream, const char *format, ...);

   

    从一个流中读数据

    size_t fread(char *buffer,size_t size,size_t count,FILE *stream);

    写数据到一个流

    int fwrite(const char *buffer, size_t size, size_t count,

FILE *stream);

 

    获取流的文件位置指示符

    int fgetpos(FILE *stream, fpos_t *pos);

    设置流位置指示符

    int fsetpos(FILE *stream, const fpos_t *pos);

    移动文件指针到一个指定的位置

    int fseek(FILE *stream, long offset, int origin);

    获得文件指针相对于文件头的偏移量

    long ftell(FILE *stream);

    重新定位一个文件指针到文件开头

    void rewind(FILE *steam);

 

    删除一个文件

    int remove(const char *path);

    更改一个文件或目录

    int rename(const char *oldname, const char *newname);

    缓冲区:

           _IOFBF

           _IOLBF

           _IONBF        缓冲区类型

           BUFSIZE        缓冲区尺寸>=256

 

    刷新一个流并清空与流相关的缓冲区的内容

    int fflush(FILE *stream);

    控制流的缓冲区,已经被setvbuf代替

    void setbuf(FILE *stream, char *buffer);

    控制流的缓冲区类型和缓冲区大小

    int setvbuf(FILE *stream, char *buffer, int mode, size_t size);

 

    将一个格式化数据写入一个字符串

    int sprintf(char *buffer, const char *format, ...);

    从字符串中读格式化数据

    int sscanf(const char *buffer, const char *format, ...);

    从参量列表指针格式化到字符串

    int vsprintf(char *buffer, const char *format, va_list ap);

临时文件

       L_tmpnam   临时文件名长度>0

       TMP_MAX    产生唯一文件名的最大数目>=25

 

以二进制读写的方式建立一个临时文件

FILE *tmpfile(void);

建立一个临时文件名

char *tmpname(char *string);

    标准流:

           stdin  标准输入流

           stdout 标准输出流

           stderr 标准错误输出流

   

    从stdin获得一个字符

    int getchar(void);

    把字符写道stdout

    int putchar(int c);

 

    从stdin中获取一行

    char *gets(char *buffer);

    写一个字符串到stdout

    int puts(const char *string);

 

    打印一个错误消息到stderr

    void perror(const char *error);

 

    打印格式化数据到stdout

    int printf(const char *format, ...);

    从stdin读格式化数据

    int scanf(const char *format, ...);

    从参量列表指针格式化到stdout

    int vprintf(const char *format, va_list ap);

 

3:<stdlib.h>

    <stdlib.h>中定义的函数都是工具类的函数可以分类学习

    其他:

       NULL

       size_t

   

    执行一个系统命令

    int system(const char *command);

    程序控制:

       EXIT_SUCCESS

       EXIT_FAILURE  exit函数的推出参数

      

    终止当前进程并返回一个错误代码

    void abort(void);

    在推出时执行指定的函数

    int atexit(void(*func)(void));

    终止调用进程

    void exit(int status);

   

    数学工具:

       div_t  函数div的返回类型

       ldiv_t 函数ldiv的返回类型

 

       RAND_MAX   rand函数返回的最大值

      

    产生一个伪随机数

    int rand(void);

    设置一个随机起始点

    void srand(unsigned int seed);

 

    计算绝对值

    int abs(int i);

    计算一个long整数的绝对值

    long labs(long l);

 

    执行一个快速排序

    void qsort(void *base, size_t count, size_t size,

              int (*compare)(const void *elem1, const void *elem2));

    执行一个排序数组的二叉查找

    void *bsearch(const void *key, const void *base,

size_t count, size_t size,

int(*compare)(const void *elem1,const void *elem2)

);

    计算两个数的商与余数

    div_t div(int number, int denom);

    计算两个long整数的商和余数

    ldiv_t ldiv(long number, long denom);

   

    字符/字符串工具

       wchar_t    宽字符宽度

       

       MB_CUR_MAX 多字节字符中的最大字节数

 

    将字符串转换成双精度

    double atof(const char *string);/*可含有非数字字符 */

    将字符串转换成整数

    int atoi(const char *string);

    将字符串转换成长整形

    long atol(const char *string);

    把字符串转换成一个双精度值

    double strtod(const char *string, char **endptr);/*可以含有非数字

字符,被截掉的字符存在endptr中*/

    把字符串转换成长整形

    long strtol(const char *string, char **endptr, int base);

    把字符串转换成无符号长整形

    unsigned long strtoul(const char *string, char **endptr, int base);

 

    获取长度和确定一个多字节字符的有效性

    int mblen(const char *s, size_t count);

    将一个多字节字符序列转换成宽字符序列

    size_t mbstowcs(wchar_t *wcstr, const char *mbstr, size_t count));

    将一个多字节字符转换成对应的宽字符

    int mbtowc(wchar_t *wchar, const char *mbchar, size_t count));

    将一个宽字符序列转换成一个多字节字符序列

    size_t wcstombs(char *mbstr, wchar_t *wcstr, size_t count));

    将一个宽字符转换成一个多字节字符

    int wctomb(char *mbchar, wchar_t wchar);

   

    内存管理工具:

    分配内存块

    void *malloc(size_t size);

    在内存中分配一个数组并初始化为0

    void *calloc(size_t count, size_t size);

    重新分配内存块

    void *recalloc(void *memblock, size_t size);

    释放一块内存

    void free(void *memblock);

    环境工具:

    从当前环境中取得一个值

    char *getenv(const char *varname);

 

4<ctype.h>

<ctype.h>头文件中定义了有关于字符操作的函数

 

判断一个字符是否为控制字符(0x00 ~ 0x1f 或 0x7f)

int iscntrl(int c);

判断一个字符是否为空白字符(0x09 ~ 0x0d 或 0x20)

int isspace(int c);

判断一个字符是否为可打印字符(0x20 ~ 0x7e)

int isprint(int c);

判断一个字符是否为非空格的其他可打印字符(0x21 ~ 0x7e)

int isgraph(int c);

判断一个字符是否为标点字符

int ispunct(int c);

判断一个字符是否为字母数字字符

int isalnum(int c);

判断一个字符是否为十进制数字字符

int isdigit(int c);

判断一个字符是否为十六进制数字字符

int isxdigit(int c);

判断一个字符是否为字母字符

int isalpha(int c);

判断一个字符是否为大写字母字符

int isupper(int c);

判断一个字符是否为小写字母字符

int islower(int c);

 

转换字符为小写

int tolower(int c);

转换字符为大写

int toupper(int c);

 

 

    5<string.h>:

    <string.h>中声明的函数都是关于c字符串和内存操作的函数

    其他:

    NULL

    size_t

    内存操作:

    查找内存块中的一个字符

    void *memchr(const void *buffer, int c, size_t count);

    比较两个内存块中的字符

    int memcmp(const void *buffer1,const void *buffer2,size_t count);

    在在内存块之间拷贝字节

    void *memcpy(void *dest, const void *src, size_t count);

    移动内存块

    void *memmove(void *dest, const void *src, size_t count);

    用指定的字符填充内存

    void *memset(void *dest, int c, size_t count);

 

对于以上的函数中的size_t count项使用需注意了

当你按如下方式使用是错误的

str = (char *)malloc(sizeof(char)*81);

strp = (char *)memchr(str, ‘u’, sizeof(str));

free(str);

这是错误的str是指针它的长度不是整个字符串的长度,所以strp得不到正确的结果

应改为一个确定的数或者是实际数组的长度如strlen(str).

 

    字符串操作:

    字符串拼接

    char *strcat(char *dest, const char *src);

    向一个字符串末尾添加指定长度的字符串

    char *strncat(char *dest, const char *src, size_t n);

 

    在字符串中查找一个字符

    char *strchr(const char *str, int c);

    在一个字符串中查找一个字符最后一次出现

    char *strrchr(const char *str, int c);

 

    比较字符串

    int strcmp(const char *str1, const char *str2);

    比较两个字符串中指定长度的子串的大小

    int strncmp(const char *str1, const char *str2, size_t n);

 

    使用指定场所的信息比较字符串

    int strcoll(const char *str1, const char *str2);

    基于指定场所转换一个字符串

    size_t strxfrm(char *dest, const char *src, size_t n);

 

    拷贝一个字符串

    char *strcpy(char *dest, const char *src);

    将源字符串中指定长度的子串拷贝到目的串中

    char *strncpy(char *dest, const char *src, size_t n);

 

    查找一个子串

    char *strstr(const char *string, const char *str);

    查找string包含str中包含的字符的长度,例如:

    string = “cabbage”; str = “abc”; return value = 5;

string = “cab bage”; str = “abc”; return value = 3;

string = “cafbbage”; str = “abc”; return value = 2;

string = “vcabbage”; str = “abc”; return value = 0;

    size_t strspn(const char *string, const char *str);

    在一个字符串中查找另一字符串的任意字符第一次出现的下标例如

    string = “cabbage”; str = “ag”; return value = 1;

    string = “xcabbage”; str = “ag”; return value = 2;

    size_t strcspn(const char *string, const char *str);

    返回在string中出现str字符集中的第一个字符的位置例如:

    string = “kdkow adkf akkei”;str = “aeiw”;

    return value = “w adkf akkei”;

    char *strpbrk(const char *string, const char *str);

    查找字符串中下一个语言符号

    所谓的语言符号就是指用户定义的表示一个意义的整体,string是字符串,str是包含分割语言符合的分隔符的集合.使用方法例如:

    token = strtok(string,str);

    while(token != NULL)

{

    puts(token);

    token = strtok(NULL, str);

}

如

string = “kks/niiwo jfie/twlk,diwpob.owf’ksif/nli”;

str = “ /n/t,.’”;

结果为:

kks

iiwo

jfie

wlk

diwpob

owf

ksif

li

如

str = “w”;

结果为:

kks/nii

o jfie/t

lk,di

pob.o

f’ksif/nli

    char *strtok(char *string, const char *str);

 

    通过系统错误编号来获得系统错误消息

    char *strerror(int errorcode);

    获取字符串有效长度(不包括’/0’)

    size_t strlen(const char *str);

 

6<limits.h>:

<limits.h> 中定义了整形的各种形式的边界值

char

CHAR_BIT   一个char占的位数

MB_LEN_MAX 多字节中char占的字节数

 

CHAR_MAX

CHAR_MIN

 

SCHAR_MAX

SCHAR_MIN

 

UCHAR_MAX

short

SHRT_MAX

SHRT_MIN

 

USHRT_MAX

int

INT_MAX

INT_MIN

 

UINT_MAX

long

LONG_MAX

LONG_MIN

 

ULONG_MAX

 

7<stddef.h>:

NULL

size_t

wchar_t

ptrdiff_t   指针之间的差值

 

size_t offsetof(structName,memberName); 结构成员相对于结构的偏移量

 

8<time.h>

NULL

size_t

 

CLOCKS_PER_SEC         每秒的时钟数

CLK_TCK                每秒的时钟数被CLOCKS_PER_SEC代替

 

clock_t    clock函数的返回类型表示进程的逝去时钟数

time_t     time等函数的返回值表示日历时间

 

struct tm

{

    int tm_sec;   秒(0-59)

    int tm_min;   分钟(0-59)

    int tm_hour;  小时(0-24)

    int tm_mday;  月中的天数(多少号)(1-31)

    int tm_mon;   月份(0-11)

    int tm_year;  年份从1900年开始

    int tm_wday;  星期(0-6,星期日=0)

    int tm_yday;  一年中的日期(0-365,1月1号 = 0)

    int tm_isdst; 夏令时(正数有效,0无效,负数未定义)

};

 

返回调用进程使用的时钟数

clock_t clock(void);

 

获取系统时间(从1970,1,1 00:00:00 开始到现在的的秒数)

timer可以为NULL表示只返回不存储

time_t time(time_t *timer);

返回两个时间的差值

double difftime(time_t time1, time_t time2);

将time_t转换成字符串

char *ctime(const time_t *timer);

转换一个时间值有time_t转换到struct tm

struct tm *locattime(const time_t *timer);

gmtime使用UTC世界时间代码而不是本地时间

struct tm *gmtime(const time_t *timer);

将struct tm转换成time_t

time_t mktime(struct tm *timer);

localtime gmtime mktime使用同一个struct tm静态结构.每次调用前都清除其中的容

 

将struct tm转换成字符串

char *asctime(const struct tm *timer);

格式化一个时间字符串

size_t strftime(char *dest,size_t size,const char *format,

                  const struct tm *timer);

 

 

9<float.h>:

<float.h>与<limits.h>一样是定义边界值的,<float.h>定义的是浮点数的边界值

double

DBL_DIG           double小数点后面精确的位数

DBL_EPSILON       小的正数,double的0跨度值

DBL_MANT_DIG      尾数中的位数

DBL_MAX           最大值

DBL_MAX_10_EXP    最大10进制指数

DBL_MAX_EXP       最大2进制指数

DBL_MIN           最小值

DBL_MIN_10_EXP    最小10进制指数

DBL_MIN_EXP       最小2进制指数

float

FLT_DIG           float小数点后面精确的位数

FLT_EPSILON       小的正书,float的0跨度值

FLT_MANT_DLG      尾数中的位数

FLT_MAX           最大值

FLT_MAX_10_EXP    最大10进制指数

FLT_MAX_EXP       最大2进制指数

FLT_MIN           最小值

FLT_MIN_10_EXP    最小10进制指数

FLT_MIN_EXP       最小2进制指数

FLT_RADIX         进制基数

FLT_ROUNDS    加法舍入

long double

LDBL_DIG          long double小数点后面精确的位数

LDBL_EPSILON      小的正数,long double的0跨度值

LDBL_MANT_DLG     尾数中的位数

LDBL_MAX          最大值

LDBL_MAX_10_EXP   最大10进制指数

LDBL_MAX_EXP      最大2进制指数

LDBL_MIN          最小值

LDBL_MIN_10_EXP   最小10进制指数

LDBL_MIN_EXP      最小2进制指数

 

10<math.h>

<math.h>中定义了数学函数

HUGE_VAL      最大的可表示的双精度值,这个值是由许多数学函数错误时返回的,有的函数返回-HUGE_VAL

EDOM          当传递的参数类型或数值错误时errno被赋予这个值

ERANGE        当数值超出浮点数的范围时errno被赋予这个值

 

三角函数

计算正弦

double sin(double x);

计算双曲线的正弦

double sinh(double x);

计算余弦

double cos(double x);

计算双曲线余弦

double cosh(double x);

计算正切

double tan(double x);

计算双曲线正切

double tanh(double x);

计算反余弦

double acos(double x);

计算反正弦

double asin(double x);

计算反正切

double atan(double x);

计算y/x的反正切

double atan2(double y, double x);

 

幂函数

计算x的y次幂

double pow(double x, double y);

计算平方根

double sqrt(double x);

计算指数值

double exp(double x);

计算自然对数

double log(double x);

计算以10为底的对数

double log10(double x);

 

浮点数操作函数

返回大于或等于x的最小整数

double ceil(double x);

计算浮点数的绝对值

double fabs(double x);

返回小于等于x的最大整数

double floor(double x);

计算x/y的余数

double fmod(double x, double y);

获得一个浮点数的尾数和指数

double frexp(double x, int *expptr);

从尾数和指数计算一个实数

double ldexp(double x, int exp);

把一个浮点数分解成小数和整数

double modf(double x, int *intptr);

 

11<errno.h>

errno         各种错误条件的事件赋予的错误代码如EDOM,ERANGE等

 

12<locale.h>

一个程序用于指定该程序使用哪一部分场所信息.

NULL

 

LC_ALL        影响所用的方面

LC_COLLATE    影响字符串校验函数strcoll,strxfrm

LC_CTYPE      影响<ctpye.h>中定义的字符处理函数

LC_MONETARY   影响localeconv返回的钱币格式信息

LC_NUMERIC    影响localeconv返回的非钱币格式的使用小数的数字信息,包括格式化,字符转换等

LC_TIME       影响strftime

 

 

 

struct lconv

{

成员                     “C”场所值 场所范围       成员含义

    char *currency_symbol;       “”     LC_MONETARY   当前场所的地方货币

符号

char *int_curr_symbol;       “”     LC_MONETARY   当前场所的国际货币

符号

    char *mon_decimal_point; “”     LC_MONETARY   货币量的小数点

    char *mon_grouping;         “”     LC_MONETARY   货币量每个数字组的

尺寸

    char *mon_thousands_sep; “”     LC_MONETARY   货币量小数点左边的

数字分组字符

    char *negative_sign;     “”     LC_MONETARY   负货币量表示符号的

字符串

    char *positive_sign;     “”     LC_MONETARY   正货币量表示符号的

字符串

    char *decimal_point;     “.”    LC_NUMERIC 非货币量的小数点

    char *grouping;             “”     LC_NUMERIC 非货币量的每个数字

的尺寸

    char *thousands_sep;     “”     LC_NUMERIC 非货币量小数点左边

数字分组字符

 

    char frac_digits;    CHAR_MAX   LC_MONETARY   格式化货币量中小数

点右边的数字位数

    char int_frac_digits;    CHAR_MAX   LC_MONETARY   国际格式化货币量中

小数点右边的数字位

数

    char n_cs_precedes;      CHAR_MAX   LC_MONETARY   如果货币符号位于负

格式货币量之前,它

设置为1;如果符号在

值以后,设置为0

    char n_sep_by_space; CHAR_MAX   LC_MONETARY   如果货币符号通过空

                                                            格从负格式货币量中

分离则设置为1,没有

空格则为0

    char n_sign_posn;    CHAR_MAX   LC_MONETARY   负格式货币量值正符

                                                            号的位置

    char p_cs_precedes;      CHAR_MAX   LC_MONETARY   如果货币符号位于非

                                                            负格式货币量之前,

                                                            它设置为1,如果符号

                                                            值以后,设置为0

    char p_sep_by_space; CHAR_MAX   LC_MONETARY   如果货币符号通过空

格从非负格式货币量

中分离则设置为1,没

有空格为0

    char p_sign_posn;    CHAR_MAX   LC_MONETARY   非负格式货币量值正

                                                            符号的位置

};

结构中的char *成员等于””的长度为0或不被当前场所支持,char成员为非负数CHAR_MAX的不被当前场所支持.

 

获得场所设置的详细信息

struct lconv *localeconv(void);

定义一个场所

char *setlocale(int category,const char *locale);

 

13<setjmp.h>

jmp_buf    setjmp和longjmp使用的类型,用来保存和恢复应用程序环境

 

保存当前应用程序的环境

int setjmp(jmp_buf env);

恢复栈环境和执行场所

void longjmp(jmp_buf env, int val);

 

这两个函数的使用是有顺序性的一定是先调用setjmp来存储环境变量,再通过longjmp来恢复环境变量

它的执行过程是这样的(:前面的时行号)

#include <stdio.h>

#include <setjmp.h>

 

jmp_buf ebuf;

 

void f2(void);

 

int main(void)

{

    int i;

    puts("1");

0:  i = setjmp(ebuf);

1:  if(i == 0)

    {

2:     f2();

3:     printf("This will not be printed");

    }

4:  printf("%d/n",i);

 

    return 0;

}

 

void f2(void)

{

5:  puts("2");

6:  longjmp(ebuf,100);

}

 

上面的函数的执行过程是这样的

0行第一次执行setjmp时ebuf中保存了当前的系统环境变量,并返回0.接下来执行第1行,这是i等于0,执行第2行由次进入了f2中,第五行向stdout中打印了2,然后第6行调用了longjmp恢复了系统环境变量,注意这时函数的执行又回到了第0行而不是执行f2后面的第3行,这时setjmp返回的函数就不是0了而是longjmp中的100,所以接下来执行的第1行中的i等于100了直接执行第4行.所以第3行永远也没有机会执行.

 

14<signal.h>

信号

SIGABRT    异常中止,缺省动作是推出程序并返回推出码3

SIGFPE     浮点错误,例如溢出,除0或无效操作,缺省终止程序

SIGILL     非法指令,缺省终止程序

SIGINT     CTRL+C中断,缺省调用INT23H中断

SIGSEGV    非法存储访问,缺省终止程序

SIGTERM    终止请求传送到程序,缺省终止程序

行为

SIG_DFL    使用系统缺省响应,如果调用程序使用流I/O,由运行库建立缓冲区不刷新.

SIG_IGN    忽略中断信号,这个值从不会为SIGFPE给出,因为该进程的浮点状态无定义

SIG_ERR    错误.

 

sig_atomic_t

 

发送一个信号给应用程序,如果以前使用signal安装了一个信号处理程序则执行该程序,没有则执行信号的缺省行为

int raise(int sig);

设置中断信号处理,signo是中断要处理的信号,必须是上面的信号之一,func是处理函数的地址或者使用上面的行为,如果func是函数的地址,则这个函数在调用signal时就被安装.

void (*signal(int signo,void(*func)(int)))(int);

 

按照如下的方法使用signal函数

#include <stdio.h>

#include <setjmp.h>

#include <signal.h>

#include <stdlib.h>

 

jmp_buf env;

 

void fpHander(int signo);

 

int main(void)

{

    int jmpflag;

    double d1,d2,r;

 

0:  if(signal(SIGFPE,fpHander) == SIG_ERR)

    {

       perror("Can't install the SIGFPE hander");

       abort();

    }

    else

    {

       jmpflag = setjmp(env);

       if(jmpflag == 0)

       {

           printf("Test for div:");

           scanf("%lf%lf",&d1,&d2);

1:         r = d1/d2;

           printf("r:%G/n",r);

           printf("d2 is not 0/n");

 

           r = d1*d2*d2*d1*d2*d2;

2:         printf("r:%G/n",r);

           printf("r is not overflow/n");

 

3:         if(d2 == 0)

4:             raise(SIGFPE);

       }

       else

       {

           printf("Signal fixed/n");

       }

    }

    return 0;

}

 

void fpHander(int signo)

{

    printf("signo:%d/n",signo);

    longjmp(env,-1);

}

一般的如果读入的d2为0的话,那么当执行第1行时就会引发浮点错误信号SIGFPE,而代用第0行安装的函数fpHander(但是在VC中好像不行,但TC中能通过)如果不能引发SIGFPE只好自己来引发SIGFPE了第4行调用了raise来引发SIGFPE错误使fpHander函数执行.

 

15<stdarg.h>

在这个头文件中定义了一些宏和类型,用来实现可变参数函数.

va_list    可变参数表类型.

 

va_start   设置可变参数表头的宏

va_arg     检索当前参数的宏

va_end     清除可变参数列表的宏,是的函数能够返回.

C标准库(The Standard C Library)(英文版) C标准库“圣经”,提供完整源代码,全面深入阐述库函数的实现与运用。C程序员必备参考书。《C标准库》是由世界级C语言专家编写的C标准库经典著作。英文版已经重印十多次,影响了几代程序员。《C标准库》结合C标准的相关部分,精辟地讲述了每一个库函数的使用方法和实现细节,这正是一个真正的C程序员所必须掌握的。更重要的是,书中给出了实现和测试这些函数的完整源代码。可以让你更深入地学习C语言。不仅如此,《C标准库》还讨论了一些即使是最有经验的C程序员通常也不熟悉的知识,比如国际化和独立于区域设置的程序的编写、与构建库相关的概念和设计思想。 立即下载

相关推荐

the standard C library书,本书讲述标准C库的一种实现。

这是经典的书,书中详细给出了标准C库的一种实现。对提高编程的能力大有帮助。

(转)The Standard C Library 经典的基础(上)

The Standard C Library 经典的基础   C的标志库函数是学习和使用C语言的基础,是编写经典C程序的基础,是学习其他计算机知识的基础.C标志库中一共包含了15个头文件:       1:   NDEBUG

rayylee 940

《The Standard C Library》

GNU工程有一个完全实现的C函数库,另一个来源是由P.J. Plauger 写的书《The Standard C Library》。压缩包内涵djvu和pdf两个版本,djvu文件可在linux下或则在windows下用特殊的软件查看。

C标准库(The Standard C Library) PDF

下载地址:网盘下载本书是由世界级c语言专家编写的c标准库经典著作。英文版已经重印十多次,影响了几代程序员。.本书结合c标准的 相关部分,精辟地讲述了每一个库函数的使用方法和实现细节,而这正是一个真正的c程序员所必须掌握的。更重要的是,书中给出了实现和测试这些函数的完整源 代码,可以让你更深入地学习c语言。不仅如此,本书还讨论了一些即使是最有经验的c程序员通常也...

weixin_30586085的博客 1299

TheCStandardLibrarySecondEdition.pdf 英文原版

The C Standard Library Second Edition

CSP-J 复试考点

可以用来训练思维,对于学习时间短的同学,动态规划可以帮助你迅速进入编程状态,也有助于帮你发现题目背后可能隐藏的更简便的算法。动态规划、贪心都是和子问题相关的,动态规划的基本思想是将一个大的问题划分成子问题,接着分别求解,而且能够将一些重复的计算记忆化,大大提高效率。难度加大,会涉及到二分、动态规划之类的算法,容易遗漏考虑点,不易得全分,考试的时候要注意全面性。一般是压轴题,算法不明显,剪枝的搜索、动态规划、状压 DP、树形 DP 、树、图等。枚举算法是指,列举出所有可能的取值,从中找出最优解。

GuanHeTian的博客 2214

(转)The Standard C Library 经典的基础(下)

7:   NULL   size_t   wchar_t   ptrdiff_t    指针之间的差值       size_t offsetof(structName,memberName); 结构成员相对于结构的偏移量         INT

rayylee 730

HID报告描述符实战解析:从Usage到Item的完整设计流程

本文深入解析了HID报告描述符的设计流程,从核心概念Usage(用途定义)入手,详细阐述了如何通过Item(条目)的三种角色——全局、局部与主干,构建出能被系统正确识别的设备“说明书”。文章以标准USB鼠标和键盘为例进行实战拆解,并介绍了使用Report ID与自定义设备等进阶设计方法,帮助开发者掌握这一实现USB设备即插即用的关键技术。

weixin_29230865的博客 282

The C++ Standard Library forbids macroizing keywords. Enable warning C4005 to find the forbidden mac

今天在编译项目的时候出现了报错:错误    C1189    #error:  The C++ Standard Library forbids macroizing keywords. Enable warning C4005 to find the forbidden macro.莫名其妙的,百度了一下答案不少,在此记录一下:项目属性--&gt;配置属性--&gt;c/c++--&gt;预处理...

路过的Blog 4315

maxwell与steady state thermal 通过workbench耦合仿真

文章目录maxwellsteady state thermal maxwell 1加入maxwell并打开 2导入模型 3选择求解器类型:涡流求解器eddy current 4修改模型名字不能带_等特殊符号 5为模型赋材料 6设立3D边界,各边电流进出方向为0其余方向300 7设置激励条件,可设置电流大小,相位,方向 8设置集肤深度,选取中间铜导体的体然后设置,如何设置看帮助文档 9求解设置 迭代步数 收敛精度 交流电频率 10验证条件满足计算 11求解 发现无法求解,删除ai

roymustang的博客 9201

高通410随身WiFi刷OpenWRT与Debian双系统一键集成方案

本文详细介绍高通410随身WiFi设备刷入OpenWRT与Debian双系统的一键集成方案。通过虎王工作室提供的一键刷机包,用户可轻松实现双系统部署,兼顾OpenWRT的网络功能与Debian的完整应用服务,适用于网络加速、服务器部署等多种场景,并提供了硬件资源分配与系统切换的实用指南。

docker7nomad的博客 1138

the C standard library 学习笔记

1.学习一门语言并学习其库的实现,这样才能熟练地驾驭语言工具,了解库所提供的功能和局限性, 进而在特定的应用要求下扩展库,这往往是初学者普遍忽视的一个重要细节。 2.C标准库由15个头文件中声明的函数、类型定义和宏组成。 3.标准库分为3组,可以相应地区分3个层次的C程序员: 合格程序员,、、、; 熟练程序员,、、、; 优秀程序员,、、、、、、; 目录: 0.C标准

LongolDFSQ的专栏 918

实战落地!Python抓取股票历史数据:开盘/收盘/成交量全维度爬取(附数据清洗+可视化)

股票历史数据抓取的核心是“数据准确性+完整性”,网页爬取适合小批量、个性化需求,API调用适合批量、标准化需求。多市场数据抓取:适配港股(00700.HK)、美股(AAPL)的抓取逻辑;高频数据抓取:抓取分钟级、小时级行情数据,用于短线量化策略;财务数据扩展:抓取市盈率、市净率、净利润等财务指标,结合价格数据做基本面分析;量化策略回测:将清洗后的数据接入Backtrader、VNPY等量化框架,验证策略有效性。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1740

The Standard C Library电子书pdf下载

C标准库(英文版)电子书pdf下载链接: https://pan.baidu.com/s/1i807V-Fbaje4x_G2E3hPzg 提取码获取方式:关注下面微信公众号,回复关键字:1145

欢迎关注微信公众号:DroidMind 2267

STM32 TIM3硬件XOR+复位模式实现霍尔信号精准捕获

霍尔传感器是电机控制系统中获取转子位置的关键器件,其三路数字信号需通过高精度、低延迟的边沿检测机制转换为电角度信息。其核心原理在于利用定时器输入XOR逻辑合并多路信号,并结合从模式复位(Reset Mode)实现硬件级时间间隔测量——每次跳变强制计数器清零,使CNT值直接表征换相周期。该方案规避了软件轮询的不确定性,显著提升FOC控制的实时性与鲁棒性。典型应用场景包括BLDC/FOC电机驱动、机器人关节伺服及工业变频器设计,尤其适用于STM32F4系列等具备硬件XOR与从模式控制器的MCU平台。

weixin_28931507的博客 92

RT-DETR改进策略【卷积层】| ECCV-2024 小波卷积WTConv 增大感受野,降低参数量计算量,独家创新助力涨点

本文记录的是利用模块优化的目标检测网络模型。的目的是在不出现过参数化的情况下有效地增加卷积的感受野,从而解决了在感受野扩展中的参数膨胀问题。本文将其加入到深度可分离卷积中,有效降低模型参数量和计算量,并二次创新,使模块更好地捕捉低频特征,增强网络性能。Wavelet Convolutions for Large Receptive Fields小波卷积及其改进的实现代码如下: 四、创新模块 4.1 改进点1⭐ 模块改进方法:加入(第五节讲解添加步骤)。添加后如下:模块改进方法:基于的(第五节讲解添加步骤)

Limiiiing的博客 1504

The beginning of C++ standard template library study

今天看代码看得真心沮丧,觉得之前学的C语言的知识真是完全不够用,在网上搜到这本 The C++ standard library - a tutorial and reference,决心要好好地系统学习C++这门语言,从今天开始。 这本书既可以当作学习的tutorial,同时也能作为编程时的工具书参考,是一本十几年来都销售得很好的关于C++的书籍,希望我能在这个过程中真正理解C++,欢迎大家的批

wgoodman的博客 310

【即插即用模块】注意力篇 | MICCAI 2023 | MFE:多尺度特征提取,告别固定感受野,猛涨2个点!

本文提出一种用于低分辨率乳腺癌病理图像超分辨率与分类的网络SHISRCNet。针对现有方法处理低分辨率图像效果差、感受野固定等问题,设计了多特征提取模块(MFE),通过多速率空洞卷积覆盖全尺度感受野(局部到全局),结合递进残差连接和动态权重融合机制,实现自适应多尺度特征增强。实验表明,该模块在超分辨率任务中PSNR提升近2个点,分类准确率显著提高。代码提供详细注释,支持即插即用,适用于各类多尺度视觉任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 207

QtCreator error: C1189: #error: The C++ Standard Library forbids macroizing keywords

解决方法,注释掉pcap-stdinc.h里的: //#define inline __inline

tangcheng12354的博客 1120

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

beyond+the+c+++standard+library中的lambda教程

今晚费了好大劲也没理解lambda,看了beyond+the+c+++standard+library.chm 茅塞顿开,一开始还认为这本书老了,没想到还是这么经典!啥也别说了,附上以飨网友。 用法与其它许多 Boost 库一样,这个库完全定义在头文件中,这意味着你不必构建任何东西就可以开始使用。但是,知道一点关于

1246

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Error 22 error C1189: #error : The C++ Standard Library forbids macroizing keywords. Enable warning

Error 22 error C1189: #error :  The C++ Standard Library forbids macroizing keywords. Enable warning C4005 to find the forbidden macro. c:\program files (x86)\microsoft visual studio 12.0\vc\include

荪荪的博客 4921

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

printk - The standard C library routine printf(), but without all the baggage

/* * File: printk.c * Purpose: The standard C library routine printf(), but without * all the baggage. */ #include &lt;stdarg.h&gt; /*****************************...

weixin_34248705的博客 93
上一篇: C++操作数的类型转换(一)
下一篇: The syntax of C in Backus-Naur form
mindview
博客等级 码龄19年 7粉丝 10原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值