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;
}

最新文章

  1. windows系统在python3.5环境下安装mysql组件
  2. 使用UISegmentedControl的一个注意事项
  3. Android 学习第2课,下载 eclipse 工具
  4. Introduction to Computer Networks(网络架构与七层参考模式)
  5. C++经典编程题#4:单词翻转
  6. C#Web编程
  7. JAVA 图形界面 JFrame容器
  8. ASP.NET MVC5学习笔记之Action参数模型绑定之模型元数据和元数据提供
  9. hdu-5686 Problem B(斐波那契数列)
  10. JS的replace()的应用
  11. for语句之打印三角形问题
  12. feature2d相关
  13. submit提交表单后,不刷新当前页面
  14. css秘密花园
  15. Modelsim独立仿真Vivado Clocking Wizard IP Core
  16. kubernetes controller 实现
  17. 原生js获取鼠标坐标方法全面讲解:clientX/Y,pageX/Y,offsetX/Y,layerX/Y,screenX/Y
  18. [Nginx] Configuration for SPA
  19. 深入浅出理解 COOKIE MAPPING
  20. canvas 实现飘浮桥效果

热门文章

  1. 【git】2.5远程仓库的使用
  2. 移动端wifi测试点总结
  3. YOLO v6:一个硬件友好的目标检测算法
  4. 《ImageNet Classification with Deep Convolutional Neural Networks (AlexNet)2012》
  5. jar打包exe选型
  6. 搭建webssh和nginx反向代理
  7. Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:3.0.0-M5:test (default-test) on project
  8. vue中常用的插件
  9. CF319D 题解
  10. k8s资源清单