文件预处理

常见的预处理符号

__FILE__ 代码所在文件名,

__LINE— 代码在多少行

__DATE__日期

__TIME__时间

可以直接用

文件预处理_第1张图片

常见的预处理指令

#include 头文件包涵

#pragma psck(4)设置默认对其数

#define,可以定义标识符常量,也可以定义宏

定义标识符常量

#define 名字   标识符常量

在预处理阶段就完成替换,因为是替换过去的所以不要加    ;   分号

文件预处理_第2张图片

宏的定义,允许把参数替换到文本中,这种通常叫做宏

#define  名字(参数)   ()

文件预处理_第3张图片

 这么写感觉没什么问题,那把传进去变成2+1,3+1呢

文件预处理_第4张图片

 此时此刻值发生了变化,3*4不是12吗

因为是替换的关系 所以变成 2+1*3+1,有优先级

加上括号就是我们想要的样子,并不会因为优先级的关系,先算1*3;

文件预处理_第5张图片

 在写宏的时候要 多用括号

宏的副作用

有副作用的宏#define MAX(x) (++x);

没有副作用的宏#define MAX(x) (x+1);

改变原数据的是有副作用的宏

# 和 ##

有没有宏能做到,而函数做不到的呢?

先看下面

文件预处理_第6张图片

 函数恩能不能实现,比如,如果变量是a ,字符串中的变量是a,变量是b,字符串中的就是b呢

我们先把他分装一个函数。

文件预处理_第7张图片

 由图可以看出函数实现不了,不管参数是什么,是都是n的值

难道真的实现不了了吗?能,用宏可以实现

讲这个的时候在,来个铺垫,先看我们的第一个代码

文件预处理_第8张图片

 接下来我换个写法

#include
int main() {
	printf("hello ""word");
}

可以打印吗??,当然可以

文件预处理_第9张图片

 我们发现打印的时候从两个字符串好像变成一个字符串。这个是c语音特点,可以吧一个字符串,拆成几段来写

有了这个,下宏就好理解了,

文件预处理_第10张图片

 #放在N前面的作用是什么呢

它会吧N不做任何的替换,转换成对应字符串,这里吧a转换成"a";

所以转换后的结果是printf("a""的值是%d",N);

接下来介绍##

##可以把他两边的符号合成一个符号

举个例子

文件预处理_第11张图片

 由此可以看出,##作用是把两边的字符合成一个字符

undef 名字 移除一个宏定义

这个宏就用不了了

命令行定义

条件编译

#ifdef 名字 如果定义过执行,否则不执行

#endif

#if (常量表达式)如果表达式为真参与编译,否则不编译

#endif

#if

#elif

#else

#endif

就跟if else 一样

#if defined(定义) 定义过执行,否则不执行,

if !defined(定义) 定义过不执行 #ifndef 反面

可以嵌套

让头文件中引用一次

#ifdef 名字

#define 名字

#endif

或者

#pragma once 太老版本编不过去

你可能感兴趣的:(见习,c语言)