简介: 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 once
class MyClass {
public:
MyClass() {
// 构造函数
}
void DoSomething() {
// 类的成员函数
}
};
int main() {
MyClass obj;
obj.DoSomething();
return 0;
}
6.使用 #pragma once 防止重复定义宏:
// Constants.h
#pragma once
#define PI 3.1415926
int main() {
// 使用宏定义的值
double radius = 5.0;
double area = PI * radius * radius;
return 0;
}
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;
}