返回介绍

10.3.3 #ifndef 命令

发布于 2025-04-11 22:33:06 字数 1765 浏览 0 评论 0 收藏 0

#ifndef 是与#ifdef 意思相反的一个预处理命令,中间的 n 表示 non 的意思。它的使用格式为:

#ifndef 宏名
语句块 1
#else
语句块 2
#endif

若指定的宏没有被定义,则让语句块 1 参与编译;若宏已经被定义,则让语句块 2 参与编译。

其使用方式和#ifdef 非常相似,这里就不再举例演示了。

#ifdef 命令和#ifndef 命令经常使用在头文件中,这样做的好处是,能够防止头文件的重复包含。

例如,有一个头文件“head.h”,其内容如下:

struct STU
{
    int num;
    char name[20];
    float score;
};

即头文件“head.h”中,定义了一个结构体 STU。

接下来在源文件中通过#include 命令包含头文件“head.h”,例如:

#include "head.h"
#include "head.h"
int main()
{
    return 0;
}

虽然这个程序的主函数中什么也没做,只是通过 return 语句直接返回一个 0。但代码中通过#include 命令包含了两次头文件“head.h”。

编译该程序,会得到如下的错误信息:

错误的原因在于两次包含了头文件“head.h”,每个包含命令都会被替换为结构体 STU 的定义语句,结果造成了结构体 STU 的重复定义。如果对程序代码进行预处理,会发现预处理后的源代码为:

从结果可以清晰地看到,预处理后的代码的确出现了两次结构体 STU 的定义。如何解决呢?

可以在头文件中加入条件编译来解决,修改后的头文件“head.h”的内容如下:

当源文件中第一次包含头文件“head.h”时,由于没有定义过宏__HEAD_H__,因此,便会定义宏__HEAD_H__,并将结构体 STU 的定义替换进来。当第二次包含头文件“head.h”时,由于之前已经定义了宏__HEAD_H__,因此,结构体 STU 的定义就不会再被替换进来。即使对头文件“head.h”包含再多次,也不会造成结构体 STU 的重复定义了。

对源文件进行预处理之后的内容如下:

经过预处理之后,源文件代码中只会出现一份结构体 STU 的定义。对该源文件进行编译也可以顺利通过,不会再产生错误了。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。