c++ - #pragma 曾经在不同的操作系统上工作吗?

Posted

技术标签:

【中文标题】c++ - #pragma 曾经在不同的操作系统上工作吗?【英文标题】:c++ - Does #pragma once work on different Operating Systems? 【发布时间】:2018-03-06 03:31:50 【问题描述】:

在 C++ 11 中,#pragma once 不是标准的一部分,但受到广泛支持。以下***链接表明大多数主要编译器(GCC、Clang 等)都支持它:

https://en.wikipedia.org/wiki/Pragma_once

我的电脑是 64 位 Windows 机器。使用我的编译器 (GCC),#pragma 编译一次。我的问题是,如果使用相同的编译器,#pragma once 是否也适用于其他主要操作系统(Apple、Linux 和 android)。

我确信每个操作系统都有例外,但我只是想知道#pragma 是否曾经适用于每个操作系统的标准计算机。

【问题讨论】:

它依赖于编译器,而不是依赖于操作系统。 唯一不支持它的主要编译器是 Portland Group 编译器(它确实支持 C++11):en.wikipedia.org/wiki/Pragma_once#Portability 还有一些方法可以阻止编译器。如果您的项目中有软链接目录或硬链接目录和同名头文件,您可能会欺骗编译器两次读取头文件,或者不读取它认为已经读取的头文件解决方案可能看起来是“好吧,不要那样做!”,但有时成熟的项目目录结构随着时间的推移会产生一些奇怪的情况。 【参考方案1】:

编译指示依赖于编译器,如果您使用支持的编译器,它将起作用。

但目前,通常的建议是使用带有标题保护的“pragma once”。

这种方式可以确保只包含一次文件,如果 pragma 有效,编译时间将得到改善。

【讨论】:

曾经支持编译指示的“主要编译器”也知道包含守卫,并以同样的方式对待它们。两者都用没有优势。 @BoPersson——“一视同仁”——我希望不会。例如,您可以在两个不同的文件中使用相同的包含保护; #pragma once 会出错。或者你可以用两个不同位置的同一个文件的两个副本来欺骗pragma once @Pete - 使用“相同”我的意思是编译器将记住哪些文件包含保护并检查这些宏是否仍被定义,而无需重新读取文件。还添加一次编译指示以尝试提高编译速度不会给您带来任何好处。但你说得对,这两种方法都可能失败,而且方式不同

以上是关于c++ - #pragma 曾经在不同的操作系统上工作吗?的主要内容,如果未能解决你的问题,请参考以下文章

pragma

#pragma的用法

#pragma的用法

pragma once

HLSL #pragma曾经等同?

#paragma详解