C语言之 条件编译和预处理指令
条件编译
在编译⼀个程序的时候我们如果要将⼀条语句(⼀组语句)编译或者放弃是很⽅便的。因为我们有条件编译指令。
⽐如说:
调试性的代码删除可惜,保留⼜碍事,所以我们可以选择性的编译。
#define M 1
int main()
{
int n = 10;
//#if M==1
#if M==0
printf("%d", n);
#endif
return 0;
}
1.#if 常量表达式
int main()
{
int a = 1;//这里为什么不执行呢,这就涉及到条件编译指令的预处理了,而局部变量是在编译之后才开始运行的
#if a == 1//#后面一定要是常量,不能是变量
printf("你师弟呢");
#endif
return 0;
}
2.多个分⽀的条件编译
#define M 5
int main()
{
#if M==1
printf("hehe\n");
#elif M==2
printf("haha\n");
#elif M==3
printf("hihi\n");
#else
printf("呵呵\n");
#endif
return 0;
}
3.判断是否被定义
#define LISI 10
int main()
{
//#ifdef LISI//ifdef代表的是被定义的
#ifndef LISI//ifndef代表的就是未被定义的
printf("lisi");
#endif
return 0;
}
4.嵌套指令
#if defined(OS_UNIX)//如果被定义就往下,未被就删除
#ifdef OPTION1
unix_version_option1();//内部内容也一样
#endif
#ifdef OPTION2
unix_version_option2();
#endif
#elif defined(OS_MSDOS)//一样看是否被定义
#ifdef OPTION2
msdos_version_option2();
#endif
嵌套指令防止头文件的重复调用,防止浪费时间空间
#ifndef __TEST_H__
#define __TEST_H__
//头⽂件的内容
#endif //__TEST_H__
或者用 #pragma once,现在大多数使用这个
头⽂件的包含
头⽂件被包含的⽅式:
本地⽂件包含
#
include
"filename"
查找头⽂件直接去标准路径下去查找,如果找不到就提⽰编译错误。
使⽤
“” 的形式包含库⽂件查找的效率就低些,当然这样也不容易区分是库⽂件还是本地⽂件了。
嵌套⽂件包含
我们已经知道,
#include
指令可以使另外⼀个⽂件被编译。就像它实际出现于
#include
指令的
地⽅⼀样。
这种替换的⽅式很简单:预处理器先删除这条指令,并⽤包含⽂件的内容替换。
⼀个头⽂件被包含10次,那就实际被编译10次,如果重复包含,对编译的压⼒就⽐较⼤。
其它预处理指令
#if
#include
#ifndef
#ifdef
#elif
#define
#endif
#pragma
#else
#undef