第 16 章 C 预处理器以及 C 库(string.h 库中之 memcpy() 和 memmove())

mems.c

C预处理器,处理器

C
预处理器不是编译器的片,是编译过程被一个独自的手续。C预处理器不过一个文本替换工具,它会师指示编译器在实质上编译在此之前完成所待的事先处理。

享有的预处理器命令如故盖井号(#)起始。它必须是率先单非空字符,为了加强可读性,预处理器指令应于第一排列始发。

 

下表包含有首要的预处理器指令:

指令

描述

#define

定义宏

#include

包含一个源代码文件

#undef

取消已定义的宏

#ifdef

如果宏已经定义,则返回真

#ifndef

如果宏没有定义,则返回真

#if

如果给定条件为真,则编译下面代码

#else

#if 的替代方案

#elif

如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码

#endif

结束一个 #if……#else 条件编译块

#error

当遇到标准错误时,输出错误消息

#pragma

使用标准化方法,向编译器发布特殊的命令到编译器中

#line 

提供用于编译器信息的行号

 

预定义宏

ANSI
C定义了多大。在编程中得以应用那一个巨大,但是非克直接修改那些预定义的大。

描述

__DATE__

当前日期,以 "MMM DD YYYY" 格式表示的字符常量。

__TIME__

当前时间,以 "HH:MM:SS" 格式表示的字符常量。

__FILE__

包含当前文件名,字符串常量。

__LINE__

包含当前行号,十进制常量。

__STDC__

当编译器以ANSI标准编译时,则定义为 1。

__STDC__VERSION__

如果编译器遵循C99,则该宏的值是199901L,其他情况下,该宏没定义。

__STDC__HOSTED__

当前是宿主系统,该宏值为1,当前是独立系统,该宏值为0。

__STDC__IEC__559__

若浮点实现遵循IEC 60599标准,该宏值为1,否则无定义。

__STDC__IEC__559__COMPLEX__

若复数运算实现遵循IEC 60559标准,则该宏值为1,否则未定义。

__STDC__ISO10646__

定义为一个长整数常量。

 

图片 1

事先处理器运算符

C预处理器提供了下列运算符扶助创造宏:

1、宏延续运算符(\)

一个宏通常写于一个单行上。可是假使宏太长,单行容纳不下,则利用宏延续运算符(\)。

2、字符串常量化运算符(#)

于宏定义中,当用将巨大的参数转换为字符串常量时,则使字符串常量化运算符(#)。在宏中使用的该运算符有一个一定的参数或参数列表。

3、标记粘贴运算符(##)

宏定义内的记号粘贴运算符(##)会联合两独参数。它同意以宏定义中简单单独立的标志为合并为一个号。

4、defined()运算符

先处理器defined运算符是用当常量表达式中,用来规定一个标识符是否曾经运用
#define定义了。假设指定的标识符已定义,则值为确实(非零)。假如指定的标识符未定义,则值吗假(零)。

 

图片 2图片 3

参数化的大

CPP一个强硬的力量是可以参数化的宏来模拟函数。

于行使带有参数的宏此前,必须动#define指令定义。参数列表是满载在圆括号内,且必须紧跟以宏名称的后。宏名称和左圆括号中不允许有空格。

http://www.bkjia.com/Cyy/1154430.htmlwww.bkjia.comtruehttp://www.bkjia.com/Cyy/1154430.htmlTechArticleC预处理器,处理器 C
预处理器不是编译器的有,是编译过程遭到一个独的步调。C预处理器仅是一个文书替换工具,它汇合指示编译器…

次第最终一蹩脚调整用 memcpy() 从 double 类型数组中把数量拷贝到 int
类型数组中,演示了 memcpy()函数不关注数据的类,它仅担负从一个职务将一些字节拷贝到其他一个职位。而且,拷贝过程中也未会晤展开类型转换。假诺因而循环对数组中的每个元素赋值,double
类型的值会在赋值过程叫转换为 int
类型的值。这种情况下,按原样拷贝字节,然后程序将这多少个号构成解释成 int
类型。

 1 /*-----------------------------------------
 2     mems.c -- 使用 memcpy() 和 memmove()
 3 -----------------------------------------*/
 4 
 5 #include <stdio.h>
 6 #include <string.h>
 7 #include <stdlib.h>
 8 
 9 #define SIZE 10
10 
11 void show_array(const int ar[], int n);
12 
13 int main()
14 {
15     int values[SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
16     int target[SIZE];
17     double curious[SIZE / 2] = {2.0, 2.0e5, 2.0e10, 2.0e20, 2.0e30};
18 
19     puts("memcpy() used:");
20     fputs("values (original data):\n", stdout);        //等同于 puts("values (original data):");
21     show_array(values, SIZE);
22     memcpy(target, values, SIZE * sizeof(int));
23     puts("target (copy of values):");
24     show_array(target, SIZE);
25 
26     puts("\nUsing memmove() with overlapping ranges:");
27     memmove(values + 2, values, (SIZE / 2) * sizeof(int));
28     puts("values -- elements 0-4 copied to 2-6:");
29     show_array(values, SIZE);
30 
31     puts("\nUsing memcpy() to copy double to int:");
32     memcpy(target, curious, (SIZE / 2) * sizeof(double));
33     puts("target -- 5 double into 10 int positions:");
34     show_array(target, SIZE / 2);
35     show_array(target + 5, SIZE / 2);
36 
37     return 0;
38 }
39 
40 void show_array(const int ar[], int n)
41 {
42     for (int index = 0; index != n; ++index)
43         printf("%d ", ar[index]);
44 
45     fputc('\n', stdout);
46 }

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图