简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
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;
}
2. 在同一个源文件中多次包含同一个头文件 A.h:
#include "A.h"
#include "A.h" // #pragma once 确保 A.h 只被编译一次int main() {// 主程序代码return 0;
}
3.A.h 头文件内部包含其他头文件:
// A.h
#pragma once#include "B.h"
#include "C.h"// A.h 头文件的内容
4.带有条件编译的头文件 A.h:
// A.h
#pragma once#ifdef DEBUG
// 在调试模式下执行的代码
#endif// A.h 头文件的内容
5.使用 #pragma once 防止重复定义类:
// MyClass.h
#pragma onceclass MyClass {public:MyClass() {// 构造函数}void DoSomething() {// 类的成员函数}
};int main() {MyClass obj;obj.DoSomething();return 0;
}
6.使用 #pragma once 防止重复定义宏:
// Constants.h
#pragma once#define PI 3.1415926int main() {// 使用宏定义的值double radius = 5.0;double area = PI * radius * radius;return 0;
}
7.使用 #pragma once 防止重复包含模板类:
// TemplateClass.h
#pragma oncetemplate <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;
}