迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C语言 >

C 语言中的 #ifndef

作者:迹忆客 最近更新:2023/05/05 浏览次数:

本文将演示如何在 C 语言中使用 #ifndef 避免重入包含的多种方法。


在 C 语言中使用 ifndef 保护头文件不被多次包含

C 语言中的头文件用于定义同名源文件中实现的函数的接口。接口通常包括函数原型、公开访问的数据结构的定义以及其他一些杂项。

注意,头文件可能会多次包含在源文件中,导致编译器出错。通常情况下,用 #ifndef 预处理器指令可以防止这种情况发生,这个指令叫做包装器 #ifndef。当头文件的内容被封装成如下例所示的结构时,其中指令 #ifndef MY_GUARD 是起点,#endif 是终点。ifndef 指令检查是否定义了 MY_GUARD 宏,如果没有则继续,用下一个指令定义。如果用户第二次包含相同的头,ifndef 指令将评估为 false,并忽略 #endif 指令之前的代码。因此,编译器将只从这个头文件中得到一份代码,并成功编译。

#include <stdio.h>

#ifndef MY_GUARD
#define MY_GUARD 1

#define  PER(D) #D
#define  JOIN(A,B) (A ## B)
#define  JOINX(A,B) JOIN(A,B)

int power(int base, int n) {
    int p = base;
    for (size_t i = 0; i < n; i++) {
      p *= base;
    }
    return p;
}
#endif

另一种达到同样效果的方法是在头文件中包含 #pragma once 指令。预处理器只对这些头文件扫描一次,并保证不被再次读取。下面的方法有一个缺点,就是它在不同的预处理器之间的可移植性很低,所以大家不妨坚持使用包装器 #ifndef 方法,以保证代码库有更好的灵活性。

#include <stdio.h>

#pragma once

#define  PER(D) #D
#define  JOIN(A,B) (A ## B)
#define  JOINX(A,B) JOIN(A,B)

int power(int base, int n) {
    int p = base;
    for (size_t i = 0; i < n; i++) {
      p *= base;
    }
    return p;
}

使用 ifndef 指令来确保宏在 C 语言中不会被多次定义

另外,我们也可以使用 ifndef 指令检查给定的宏表达式是否已经被定义。逻辑工作原理和上一个例子完全一样,如果表达式没有被定义,下一个 #define 指令就会进行相应的处理。#ifndef#endif 之间只有一行是一个宏定义,这意味着如果条件为假,只跳过给定的宏定义。

#include <stdio.h>
#include <stdlib.h>

#define  PER(D) #D

#ifndef DLEVEL
#define DLEVEL 6
#endif

int main() {

    for (int j = 0; j < DLEVEL; ++j) {
        printf("%s\n", PER(stringify this));
    }

    exit(EXIT_SUCCESS);
}

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 C 语言中使用 typedef enum

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文介绍了如何在 C 语言中使用 typedef enum。使用 enum 在 C 语言中定义命名整数常量 enum 关键字定义了一种叫做枚举的特殊类型。

C 语言中的静态变量

发布时间:2023/05/07 浏览次数:151 分类:C语言

本文介绍了如何在 C 语言中使用静态变量。在 C 语言中使用 static 变量在函数调用之间保存变量值

C 语言中生成随机数

发布时间:2023/05/07 浏览次数:64 分类:C语言

本文演示了如何在 C 语言中生成随机数。使用 rand 和 srand 函数在 C 语言中生成随机数

C 语言中的 i++ 与++i

发布时间:2023/05/07 浏览次数:83 分类:C语言

本文演示了如何在 C 语言中使用前缀增量与后缀增量运算符。C 语言中++i 和 i++ 记号的主要区别

C 语言中获取当前工作目录

发布时间:2023/05/07 浏览次数:182 分类:C语言

本文演示了如何在 C 语言中获取当前工作目录。使用 getcwd 函数获取当前工作目录的方法

C 语言中的位掩码

发布时间:2023/05/07 浏览次数:126 分类:C语言

本文介绍了如何在 C 语言中使用位掩码。使用 struct 关键字在 C 语言中定义位掩码数据

C 语言中的排序函数

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文演示了如何在 C 语言中使用标准库排序函数。使用 qsort 函数对 C 语言中的整数数组进行排序

C 语言中的 extern 关键字

发布时间:2023/05/07 浏览次数:114 分类:C语言

本文介绍了如何在 C 语言中使用 extern 关键字。C 语言中使用 extern 关键字来声明一个在其他文件中定义的变量

在 C 语言中使用位移操作

发布时间:2023/05/07 浏览次数:132 分类:C语言

本文演示了如何在 C 语言中使用位移操作。在 C 语言中使用 << 运算符将数字向左移位的方法

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便