【C语言复习(九)】条件编译的使用与分析

本文介绍了条件编译的基本概念及其在解决变量重复定义问题中的应用。通过示例代码展示了如何使用条件编译避免多次包含同一头文件导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1、基本概念:

条件编译的行为类似于if...else语句,只是在条件编译中,满足条件的才会被保留下来以备编译。

条件编译是预编译指示命令,用于控制是否编译某段代码。

 

示例:

#include <stdio.h>
 
#define COMMAND  1
int main()
{
    #if(COMMAND == 1)
        printf("COMMAND == 1");
    #else
        printf("COMMAND != 1");
    #endif
    return 0;
}

可以用gcc预编译一下,能看到预编译后的文件中,只剩下如下的内容:

int main()
{
 
        printf("COMMAND == 1");
 
 
 
    return 0;
}

很明显,条件编译和if...else是有本质区别的,不满足条件的代码不会被编译进最后的源代码中。

 

2、什么时候使用条件编译?

示例:建立如下三个文件,并写如下代码:

/*test.c*/
#include <stdio.h>
#include "test.h"
#include "global.h"
int main()
{
    printf("global=%d,num=%d,global*num=%d",global,num,func());
    return 0;
}

/*test.h*/
#include <stdio.h>
#include "global.h"
int num=10;
int func()
{
    return global*num;
}

/*global.h*/
int global=3;

试着编译一下test.c,会发现编译器报错,大概意思是已经定义了global变量,为什么会这样呢?使用命令行预编译一下,然后看.i文件,

预编译后生成的文件内容如下:

# 3 "test.c" 2
# 1 "test.h" 1
 
 
# 1 "global.h" 1
 
int global=3;
# 4 "test.h" 2
int num=10;
int func()
{
    return global*num;
}
# 4 "test.c" 2
# 1 "global.h" 1
 
int global=3;
# 5 "test.c" 2
int main()
{
    printf("global=%d,num=%d,global*num=%d",global,num,func());
    return 0;
}

可以看到,这里定义两次int global=3;,可是为什么会发生这种情况?

问题出在,我们在test.htest.c中都包含了global.h文件,而test.c中又包含了test.h文件,这样在预编译阶段展开#include指令时,就把global.h文件展开了两次,而预编译器并不知道将此文件包含了两次,所以在编译阶段就发生了错误!

 

如何改正??

使用条件编译!

我们做如下的修改:

/*test.h*/
#include <stdio.h>
#include "global.h"
#ifndef _TEST_H_
#define _TEST_H_
int num=10;
int func()
{
    return global*num;
}
#endif // _TEST_H_
 
 
/*global.h*/
#ifndef _GLOBAL_H_
#define _GLOBAL_H_
int global=3;
#endif

再次编译,就没问题了!添加的条件编译的指令意思为:如果没有定义_GLOBAL_H_宏,则就保留里面的语句,否则就不保留,这样就能避免重复定义变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值