条件编译、头文件的理解

文章介绍了条件编译的概念,如#define__DEBUG__用于控制代码块的编译,并展示了#if、#ifdef等预处理器指令的用法。同时,讨论了头文件的包含方式,包括本地文件包含和库文件包含,以及如何通过#ifndef避免嵌套文件包含时的内容重复。还提到了#pragmaonce作为防止头文件重复包含的另一种方法。
摘要由CSDN通过智能技术生成

条件编译

在编译一个程序的时候我们如果要将一条语句(一组语句)编译或者放弃是很方便的。因为我们有条件编译指令。
比如说:
调试性的代码,删除可惜,保留又碍事,所以我们可以选择性的编译。

#include <stdio.h>
#define __DEBUG__
int main()
{
	int i = 0;
	int arr[10] = { 0 };
	for (i = 0; i < 10; i++)
	{
		arr[i] = i;
#ifdef __DEBUG__ 
		printf("%d\n", arr[i]);//为了观察数组是否赋值成功。 
#endif //__DEBUG__
	}
	return 0;
}

#ifdef__DEBUG__ 的意思就是判断__DEBUG__是否定义,若定义则打印数组,若未定义就不打印
#endif要和ifdef成对出现
常见的条件编译指令:

#if 常量表达式
//…
#endif
//常量表达式由预处理器求值。
如:
#define DEBUG 1
#if DEBUG //if后面的语句表达式非零则进入#if
//…
#endif
2.多个分支的条件编译
#if 常量表达式
//…
#elif 常量表达式
//…
#else
//…
#endif
3.判断是否被定义
#if defined(symbol)
#ifdef symbol
#if !defined(symbol)
#ifndef symbol
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
#endif

文件包含

我们已经知道, #include 指令可以使另外一个文件被编译。就像它实际出现于 #include 指令的地方一样。
这种替换的方式很简单:
预处理器先删除这条指令,并用包含文件的内容替换。
这样一个源文件被包含10次,那就实际被编译10次。

头文件被包含的方式

本地文件包含

#include “filename”

查找策略:先在源文件所在目录下查找,如果该头文件未找到,编译器就像查找库函数头文件一样在标准位置查找头文件。
如果找不到就提示编译错误。
库文件包含

#include<filename.h>

查找头文件直接去标准路径下去查找,如果找不到就提示编译错误。
这样是不是可以说,对于库文件也可以使用 “” 的形式包含?
答案是肯定的,可以。
但是这样做查找的效率就低些,它会先在源文件所在目录下查找,如果该头文件未找到,编译器就像查找库函数头文件一样在标准位置查找头文件,这样就会效率较低。当然这样也不容易区分是库文件还是本地文件了。

嵌套文件包含

在这里插入图片描述
comm.h和comm.c是公共模块。
test1.h和test1.c使用了公共模块。
test2.h和test2.c使用了公共模块。
test.h和test.c使用了test1模块和test2模块。
这样最终程序中就会出现两份comm.h的内容。这样就造成了文件内容的重复。
如何解决这个问题?
答案:条件编译。
每个头文件的开头写:

#ifndef __TEST_H__
#define __TEST_H__
//头文件的内容
//....
#endif   //__TEST_H__

图解:
第一次打开这个文件时候会执行#ifndefine__TEST_H__判断如果没有定义__TEST_H__的话就

或者

#pragma once

就可以避免头文件的重复引入
在这里插入图片描述
我们经常用的库函数里面的源代码里面已经包含了#pragma once,所以以后我们自己写头文件的时候也要加上#pragma once

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值