【为什么】C++中的#pragma once是干什么,和#include guard区别

简介: 【为什么】C++中的#pragma once是干什么,和#include guard区别

一.

#pragma once是C和C++编程语言中的一个非标准但广泛支持的预处理指令,用于使当前源文件在单次编译中只被包含一次。它与#include guards有相同的作用,但有一些优点,如:代码更少,避免名称冲突,有时可以提高编译速度

代码例子:

// Foo.h 
#pragma once 
class Foo { };

image.gif

这个指令告诉编译器只包含一次Foo.h文件,不管它被导入了多少次。它相当于一个#include guard,但避免了一些问题。请注意,#pragma once不是任何ISO C++标准的一部分,它是编译器特定的

二.

#include guard是C和C++编程语言中的一种特殊构造,用于避免处理#include指令时出现的重复包含问题。它的作用是确保编译器只处理一次某个文件,不管它被包含了多少次。

代码例子:

// Foo.h
#ifndef FOO_H_
#define FOO_H_
class Foo { };
#endif //FOO_H_

image.gif

这个指令告诉编译器如果没有定义FOO_H_这个标识符,就定义它,并包含Foo类的代码。如果已经定义了FOO_H_,就跳过这个文件

FOO_H_是一个宏,它是通过#define FOO_H_语句定义的。这个语句告诉编译器,把FOO_H_替换为一个空值。这样,当编译器再次遇到#ifndef FOO_H_时,就会检查FOO_H_是否已经被替换过,从而判断是否需要包含Foo.h文件

三.区别

    • #include guard是一种标准的预处理指令,可以在所有符合标准的编译器和预处理器中工作。#pragma once是一种非标准的编译器特定指令,可能不被所有的编译器支持。
    • #include guard需要为每个文件定义一个唯一的标识符,而#pragma once不需要。#pragma once只需在文件开头写一行即可。
    • #include guard是通过检查文件内容来防止重复包含,而#pragma once是通过检查文件是否物理相同来防止重复包含。这意味着如果同一个文件在文件系统中有多个别名或拷贝,#pragma once可能会失效,而#include guard仍然可以工作。
    • #pragma once可以让编译器完全跳过已经包含过的文件,而不用再解析它们。这可能会提高编译速度和效率。但是一些编译器也可以对#include guard进行优化,使它们与#pragma once相当
    相关文章
    |
    4月前
    |
    存储 C++ Cloud Native
    云原生部署问题之C++ 中的 nullptr 和 NULL 区别如何解决
    云原生部署问题之C++ 中的 nullptr 和 NULL 区别如何解决
    58 0
    |
    28天前
    |
    存储 安全 编译器
    在 C++中,引用和指针的区别
    在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
    |
    5月前
    |
    存储 安全 C++
    C++中的引用和指针:区别与应用
    引用和指针在C++中都有其独特的优势和应用场景。引用更适合简洁、安全的代码,而指针提供了更大的灵活性和动态内存管理的能力。在实际编程中,根据需求选择适当的类型,能够编写出高效、可维护的代码。理解并正确使用这两种类型,是掌握C++编程的关键一步。
    76 1
    |
    1月前
    |
    C语言 C++
    C 语言的关键字 static 和 C++ 的关键字 static 有什么区别
    在C语言中,`static`关键字主要用于变量声明,使得该变量的作用域被限制在其被声明的函数内部,且在整个程序运行期间保留其值。而在C++中,除了继承了C的特性外,`static`还可以用于类成员,使该成员被所有类实例共享,同时在类外进行初始化。这使得C++中的`static`具有更广泛的应用场景,不仅限于控制变量的作用域和生存期。
    54 10
    |
    1月前
    |
    C语言 C++
    实现两个变量值的互换[C语言和C++的区别]
    实现两个变量值的互换[C语言和C++的区别]
    22 0
    |
    3月前
    |
    存储 编译器 C语言
    C++内存管理(区别C语言)深度对比
    C++内存管理(区别C语言)深度对比
    82 5
    |
    4月前
    |
    Web App开发 Rust 分布式计算
    Rust与C++的区别及使用问题之对于大量使用C++实现的产品来说,迁移到Rust的问题如何解决
    Rust与C++的区别及使用问题之对于大量使用C++实现的产品来说,迁移到Rust的问题如何解决
    |
    4月前
    |
    Rust 安全 编译器
    Rust与C++的区别及使用问题之Rust中的bound check对性能产生影响的问题如何解决
    Rust与C++的区别及使用问题之Rust中的bound check对性能产生影响的问题如何解决
    |
    4月前
    |
    Rust 测试技术 编译器
    Rust与C++的区别及使用问题之Rust项目中组织目录结构的问题如何解决
    Rust与C++的区别及使用问题之Rust项目中组织目录结构的问题如何解决
    |
    3月前
    |
    缓存 C++ Windows
    Inno setup 脚本判断 Microsoft Visual C++ Redistributable 不同版本区别
    Inno setup 脚本判断 Microsoft Visual C++ Redistributable 不同版本区别