当前位置:   article > 正文

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

#pragma once

一.

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

代码例子:

  1. // Foo.h
  2. #pragma once
  3. class Foo { };

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

二.

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

代码例子:

  1. // Foo.h
  2. #ifndef FOO_H_
  3. #define FOO_H_
  4. class Foo { };
  5. #endif //FOO_H_

这个指令告诉编译器如果没有定义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相当
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/482181
推荐阅读
相关标签
  

闽ICP备14008679号