C语言初级阶段8——预处理

预定义符号

1.概念:预处理是编译之前做的一些事。

2.常用的预定义符号:

注意:

(1)-(4)的格式占位符都用%是,如:printf("%s",DATE);

(1)-(5)的宏定义的前后分别有两个'_',而不是一个下划线。

(1)__FILE__当前编译的文件名。

(2)__FUNCTION__当前所在函数。

(3)__DATE__当前编译日期。

(4)__TIME__当前编译时间。

(5)__LINE__当前行数。格式占位符用%d,如printf("%d",LINE);

(6)_CRT_SECURE_NO_WARNINGS关闭安全检查。

#include<stdio.h>
int main()
{
printf("%s\n", __FILE__);
printf("%s\n", __FUNCTION__);
printf("%s\n", __DATE__);
printf("%s\n", __TIME__);
printf("%D\n", __LINE__);
return 0;
}

宏定义:又称为宏替换,自定义一个宏(要符合标识符的命名规则),用于替换任意数据、标识符或者表达式。(本质:替换)

1.无参宏定义:

定义无参宏定义的基本格式:#define 宏名 宏替换

不能给宏定义常量赋值

一改全改

#include<stdio.h>
#define A 4+3
int main()
{
int a = A;
printf("%d\n", a);
return 0;
}

2.含参宏定义

定义含参宏定义的基本格式:#define 宏名(参数列表) 内容。

类似一个函数,含参宏的参数是没有类型的,含参宏没有返回值。

#include<stdio.h>
#define FUN(a,b) {printf("%d\t%d\n",a,b);printf("%d\n",a+b);}
int main()
{
FUN(10, 10);
return 0;
}
#include<stdio.h>
#define FUN(a,b) {printf("%lf\t%lf\n",a,b);printf("%lf\n",a+b);}
int main()
{
FUN(1.1,1.2);
return 0;
}
#include<stdio.h>
#define F(a,b) a+b
#define F1(a,b) a*b
int main()
{
printf("%d\n", F(1, 2));
printf("%d\n", F(1 + 2, 2 + 1));
printf("%d\n", F1(1 + 2, 2 + 1));//因为把a替换成了1+2,把b替换成了2+1,所以结果是1+2*2+1=6
printf("%d\n", F1((1 + 2), (2 + 1)));//这个就为:(1+2)*(2+1)=9
printf("%d\n", F1(F(2, 1), F(1, 2)));//这个是2+1*1+2=5
return 0;
}

常量的定义

格式:const int a=10;

注意:常量必须初始化,并且不允许被修改。

#include<stdio.h>
const int a = 10;//a的值不可修改
int main()
{
int b = 10;
b = 20;
printf("%d\n", b);
return 0;
}

文件包含

1.概念:想要用库函数就需要包含头文件,也就是文件包含,当然也可以编写自定义头文件,包含自己编写的头文件。

2.基本格式:#include<文件名>或#include"文件名"

(1)包含系统头文件用<>,只会在系统头文件中去找。

(2)包含自定义头文件用"",在自定义头文件中找不到就会在系统文件中去找。

3.文件包含允许嵌套,即在一个被包含文件中可以包含其他文件。

4.头文件嵌套可能会引起头文件的重复包含,从而出现函数和变量的重定义问题,所以需要避免头文件重复包含,某些宏定义语句可以防止头文件重复包含

pragma once

//防止头文件重复包含,不让文件的内容被包含两次,在头文件最前面添加。

pragma once是VS独有的,有使用平台限制,其他平台可能不存在。

#include<stdio.h>
#include<stdlib.h>
#include "string.h"
#include"tool.h"//自定义头文件一般用""去引用,系统自带的一般是用<>引用
int main()
{
fun();
return 0;
}
#pragma once
#ifndef __TOLL_H__
#define __TOOL_H__
//头文件不定义函数,只声明函数,相当于一个功能。
#include<stdio.h>
void fun();
#endif
#include<stdio.h>
void fun()
{
printf("11111");
}

条件编译:根据不同的条件编译不同的代码

#include<stdio.h>
int main()
{
#if 1
printf("111111\n");
printf("111111\n");
#else
printf("222222\n");
printf("222222\n");
#endif
#ifdef A
printf("555555\n");
#else
printf("444444\n");
#endif
return 0;
}
#include<stdio.h>
int main()
{
#define A 3
#if 1
printf("111111\n");
printf("111111\n");
#else
printf("222222\n");
printf("222222\n");
#endif
#ifdef A
printf("555555\n");
#else
printf("444444\n");
#endif
return 0;
}
#include<stdio.h>
#define A 3
int main()
{
#ifdef A
printf("555555\n");
#else
printf("444444\n");
#endif
#ifndef A
printf("555555\n");
#else
printf("444444\n");
#endif
return 0;
}

C语言初级阶段8——预处理的更多相关文章

  1. R语言进行数据预处理wranging

    R语言进行数据预处理wranging li_volleyball 2016年3月22日 data wrangling with R packages:tidyr dplyr Ground rules ...

  2. R语言进行数据预处理

    R语言进行数据预处理wranging li_volleyball 2016年3月22日 data wrangling with Rpackages:tidyr dplyr Ground rules l ...

  3. C语言中的预处理命令

    预处理功能是C语言的重要功能. 问:为什么要预处理,什么是预处理? 答:我们知道高级语言的运行过程是通过编译程序(编译器)把源代码翻译成机器语言,实现运行的.编译程序的工作包含:语法分析.词法分析.代 ...

  4. C 语言中的预处理

    C 语言中以 # 开头的就是预处理指令,例如 #include . 预处理指令的用途 所有的预处理指令都会在 GCC 编译过程的预处理步骤解析执行,替换为对应的内容.在下一步编译过程中,看不到任何预处 ...

  5. C语言系列之预处理指令、循环左移函数的使用(四)

    本章节将讲两个知识点 第一个知识点:常用的预处理指令 第二个知识点:循环左移右移函数 第一个知识点:预处理指令 一种预处理指令是#define,他把名字A定义为P0,当这个名字出现在源文件的任何地方时 ...

  6. C语言简单编译预处理-笔记

    预处理指令 所谓预处理,是指,在编译之前对程序源码进行初步的转换,产生新的源代码提供给编译器.预处理时主要完成:包含其他源文件,定义宏,根据条件决定编译时是否包含某些代码(>防止重复包含某些文件 ...

  7. C语言进阶——编译预处理指令

    编译预处理指令 • #开头的是编译预处理指令 • 它们不是C语⾔的成分,但是C语⾔程序离不开它们 • #define⽤来定义⼀个宏 #define • #define <名字> <值 ...

  8. C语言深度剖析---预处理(define)(转载)

    1.数值宏常量     #define宏定义是个演技非常高超的替身演员,但也会耍大牌的,所以我们使用它要慎之又慎.它可以出现在代码的任何地方,从本行宏定义开始,以后的代码都认识宏了:也可以把任何东西都 ...

  9. c语言学习笔记.预处理.#ifndef

    #ifndef -> if not define 配合 #endif使用 在h头文件中使用,防止重复包含和编译. 也可以用条件编译来实现. 例如: 编写头文件 test.h 在头文件开头写上两行 ...

  10. Linux C编程学习之C语言简介---预处理、宏、文件包含……

    C的简介 C语言的结构极其紧凑,C语言是一种模块化的编程语言,整个程序可以分割为几个相对独立的功能模块,模块之间的相互调用和数据传递是非常方便的 C语言的表达能力十分强大.C语言兼顾了高级语言和汇编语 ...

随机推荐

  1. redis分布锁

    1.redis分布式锁应用的场景? 1)防止缓存穿透:热点数据过期,大量线程访问mysql 2)  防止秒杀超卖:库存数量同步给redis后,对redis数据进行扣减 3)双写一致性:缓存的数据,被修 ...

  2. superset2 开发环境部署+阿里odps连接

    引用:https://help.aliyun.com/document_detail/280392.htm https://blog.csdn.net/weixin_45684985/article/ ...

  3. css 启动页 loading动画

    <div class="index-html-loader"> <div class="text">Loading...</div ...

  4. What is REST and Restful?

    什么是rest 和 restful? 提出rest的作者,目的:符合框架原理的情况下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强,性能好,适宜通讯的架构. Fielding将他对互联网 ...

  5. Solution Set - 杭电多校 2022 Day2 一句话题解

    A:看了题就很容易想到虚树吧,建出虚树后考虑整体扫一遍虚树,注意到这是一棵根向树,那么统计其实十分简单,将对 \(C\) 类节点的标记下放,\(A,B\) 类节点同时上传,如果在 DFS 的过程中发现 ...

  6. Javascript 基础知识,ajax,面向对象

    Javascript 数据类型 数据类型 基本数据类型 数字,字符串,布尔值 undefine null undefined的常见情形:ES6新语法提供的对象解构赋值应用讲解 1.1 对象属性不存在 ...

  7. 记一次在MyBatis-Plus中 @TableField 自动填充中遇见的坑

    先放一张表生成策略对应的结果 值 描述 DEFAULT 默认不处理 INSERT 插入时填充字段 UPDATE 更新时填充字段 INSERT_UPDATE 插入和更新时填充字段 此处需要注意一下,如果 ...

  8. element-ui casader组件动态加载的回显问题

    最近在做项目的时候用到了element-ui的cascader来做省市区的级联显示 我要做的需求就是在选择某个省的时候,再去加载省下面的所有市,在实现这个需求的过程中遇到了二级菜单不能反显的情况.以下 ...

  9. javaScript面向对象(继承篇)

    一.构造函数继承   function Parent() { this.money = '2亿' this.eat = function () { console.log('吃饭') } } func ...

  10. 使用logback需要导入的jar包

    jar包名 logback-access-1.1.2.jar logback-classic-1.1.2.jar logback-core-1.1.2.jar slf4j-api-1.7.25.jar ...