• C++之#pragma once实例总结(二百四十七)


    简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

    优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

    人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

    更多原创,欢迎关注:Android系统攻城狮

    欢迎关注Android系统攻城狮

    1.前言

    本篇目的:理解C++之#pragma once用法总结。

    2.#pragma once介绍

    • #pragma once是一种预处理指令,用于告诉编译器在编译过程中只包含一次特定的头文件。它是一种非标准的C++语言扩展,主要用于避免头文件被重复包含。

    • 在C++中,头文件经常被用来包含代码的声明或定义,然后在其他源文件中进行引用。当多个源文件都包含同一个头文件时,如果没有适当的预处理指令,会导致重复定义和编译错误。

    • #pragma once指令的作用是在编译过程中检查指定的头文件是否已经被包含,如果已经包含则忽略后续的包含操作,避免重复定义和编译错误的发生。

    • 需要注意的是,虽然#pragma once是许多编译器所支持的常见特性,但它并不是C++标准的一部分,因此在使用时需要注意编译器的兼容性。

    • 总结起来,#pragma once是一种用于避免头文件重复包含的预处理指令,它可以简化代码的组织和管理,提高编译效率。

    3.代码实例

    1.包含 A.h 和 B.h:

    // main.cpp
    #include "A.h"
    #include "B.h"
    
    int main() {
        // to do....
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2. 在同一个源文件中多次包含同一个头文件 A.h:

    #include "A.h"
    #include "A.h"  // #pragma once 确保 A.h 只被编译一次
    
    int main() {
        // 主程序代码
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.A.h 头文件内部包含其他头文件:

    // A.h
    #pragma once
    
    #include "B.h"
    #include "C.h"
    
    // A.h 头文件的内容
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4.带有条件编译的头文件 A.h:

    // A.h
    #pragma once
    
    #ifdef DEBUG
    // 在调试模式下执行的代码
    #endif
    
    // A.h 头文件的内容
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    5.使用 #pragma once 防止重复定义类:

    // MyClass.h
    #pragma once
    
    class MyClass {
      public:
        MyClass() {
            // 构造函数
        }
    
        void DoSomething() {
            // 类的成员函数
        }
    };
    
    int main() {
        MyClass obj;
        obj.DoSomething();
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    6.使用 #pragma once 防止重复定义宏:

    // Constants.h
    #pragma once
    
    #define PI 3.1415926
    
    int main() {
        // 使用宏定义的值
        double radius = 5.0;
        double area = PI * radius * radius;
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    7.使用 #pragma once 防止重复包含模板类:

    // TemplateClass.h
    #pragma once
    
    template <typename T>
    class TemplateClass {
      public:
        T Add(T a, T b) {
            return a + b;
        }
    };
    
    int main() {
        TemplateClass<int> obj;
        int sum = obj.Add(5, 10);
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    Vue2数据双向绑定的原理(Object.defineProperty)
    【登录问题:拦截器和过滤器的应用】
    Linux磁盘分区
    Win11系统设置自动关机的方法分享
    Spring boot项目配置
    Codeforces Round #792 (Div. 1 + Div. 2)
    力扣labuladong——一刷day02
    react学习笔记1
    模型相关术语:Model vs DTO vs Entity vs Value Object vs Pojo vs Bean
    OpenAI的规模化经济效益与第二护城河
  • 原文地址:https://blog.csdn.net/u010164190/article/details/134060615