【为什么】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相当
    相关文章
    |
    6天前
    |
    存储 C语言 C++
    1. 认识C++和C的区别
    1. 认识C++和C的区别
    46 0
    |
    6天前
    |
    存储 算法 C++
    【C/C++ Vector容量调整】理解C++ Vector:Reserve与Resize的区别与应用
    【C/C++ Vector容量调整】理解C++ Vector:Reserve与Resize的区别与应用
    74 1
    |
    6天前
    |
    C++ 容器
    c++ STL 之 vector 的 capacity 和 size 属性区别
    c++ STL 之 vector 的 capacity 和 size 属性区别
    35 0
    |
    6天前
    |
    存储 Java 编译器
    java和c++的主要区别、各自的优缺点分析、java跨平台的原理的深度解析
    java和c++的主要区别、各自的优缺点分析、java跨平台的原理的深度解析
    144 0
    |
    6天前
    |
    编译器 C++ Python
    【C/C++ 泡沫精选面试题02】深拷贝和浅拷贝之间的区别?
    【C/C++ 泡沫精选面试题02】深拷贝和浅拷贝之间的区别?
    45 1
    |
    6天前
    |
    安全 编译器 C语言
    深入理解C/C++预处理器指令#pragma once以及与ifndef的比较
    深入理解C/C++预处理器指令#pragma once以及与ifndef的比较
    49 0
    |
    6天前
    |
    人工智能 机器人 编译器
    【C/C++】g++ 与 gcc的区别
    【C/C++】g++ 与 gcc的区别
    |
    6天前
    |
    编译器 C语言 C++
    【C++专栏】C++入门 | 类和对象 | 类的引入、struct&class的区别、类的定义
    【C++专栏】C++入门 | 类和对象 | 类的引入、struct&class的区别、类的定义
    15 0
    |
    6天前
    |
    存储 C++
    C++ 栈和堆的作用机制,及特点区别
    在介绍C++中的十分重要的动态内存管理机制之前,有必要先单独来介绍一下C++中的两个概念,分别是栈和堆。
    21 2
    |
    6天前
    |
    C++
    C++什么是深浅拷贝,深浅拷贝的区别?
    C++什么是深浅拷贝,深浅拷贝的区别?