Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 需要澄清一下#pragma吗_C++_Pragma_Precompiled Headers_Preprocessor Directive - Fatal编程技术网

C++ 需要澄清一下#pragma吗

C++ 需要澄清一下#pragma吗,c++,pragma,precompiled-headers,preprocessor-directive,C++,Pragma,Precompiled Headers,Preprocessor Directive,我到处找,想弄清楚是什么 #布拉格语一次 事实上,对于我仍然存在的一些问题,我已经找到了,也无法找到明确的答案 做 #布拉格语一次 确保包含在其中的头文件只被调用一次,并且包含在所述头文件中的头文件尚未被包含?另外,如果只调用一次,是否意味着需要特定头的.cpp文件将无法访问它?如果头文件标记为 #布拉格语一次 并且包含在.cpp中,该头文件可以在其他地方再次使用吗 这些是我找不到的澄清。抱歉,如果有文档在某个地方澄清了这一点,但我真的找不到任何足够具体的东西。#pragma once仅在单个翻

我到处找,想弄清楚是什么 #布拉格语一次 事实上,对于我仍然存在的一些问题,我已经找到了,也无法找到明确的答案

做 #布拉格语一次 确保包含在其中的头文件只被调用一次,并且包含在所述头文件中的头文件尚未被包含?另外,如果只调用一次,是否意味着需要特定头的.cpp文件将无法访问它?如果头文件标记为 #布拉格语一次 并且包含在.cpp中,该头文件可以在其他地方再次使用吗

这些是我找不到的澄清。抱歉,如果有文档在某个地方澄清了这一点,但我真的找不到任何足够具体的东西。

#pragma once
仅在单个翻译单元中保护单个文件,不包括其包含的子层次结构。(但是,如果文件的第二次包含被阻止,它就没有机会双重包含任何其他内容。)

您仍然可以从另一个
.cpp
中再次包含它

该文件通常由其inode编号标识

请注意,
#pragma once
严格来说是非标准的,大多数人仍然喜欢传统的
#ifndef
标题保护。

#pragma once
导致当前源文件在单个编译中只包含一次。 它本质上类似于
#include
卫士。

pragma一次确保它包含的头文件只被调用一次,并且包含在所述头文件中的头文件尚未被包含?

pragma不影响其他标题。如果带有pragma“a.h”的标题包含“b.h”,则可以通过第三个标题或直接包含“b.h”

另外,如果只调用一次,是否意味着需要特定头的.cpp文件将无法访问它?

您可以在任何地方包括标题,次数视情况而定

如果头文件用#pragma标记一次并包含在.cpp中,该头文件是否可以在其他地方再次使用?

是的,这是标题的正常做法


陷阱在哪里

如果确实需要多次包含标题,并且每个包含执行的操作与不使用pragma one或sentry宏不同。这些情况并不常见


pragma once
的一个好处是,它可以避免出现错误,例如有两个头文件碰巧具有相同的sentry宏。当两个头文件具有相同的文件名和宏名的相同编码样式时,可能会发生这种情况。

注意,虽然通常支持,但在技术上并不标准。好的,那么,您能帮助我理解什么是编译吗?因为对我来说,这听起来像是编译器将忽略相同头文件的所有包含,即使它可能是必需的,否则不会导致编译器错误,从而导致编译器错误。困惑的我知道我是#包括警卫有非常明显的逻辑#pragma曾经没有这样做,因为编译器所采取的操作没有传达给代码的读者。这对我有一点帮助,而且因为我在玩弄directX,代码一开始就不是平台移动的。我想我现在需要了解的是,翻译单元是什么,我打赌它是有很好的文档记录的,而且是特定于编译器的?@ManicCure,简单地说,它是一个(cpp)文件,所有的头都直接或间接包含在其中。如果您想要一个标准定义,在本国际标准中,程序文本以称为源文件的单位保存。一个源文件连同所有标题(17.6.1.2)和通过预处理指令包含的源文件(16.2)#include,减去任何条件包含(16.1)预处理指令跳过的任何源代码行,被称为翻译单元。
标准=>支持
-->
@Andreas广泛支持!=良好做法。这里有很多不值得重复的争论。从一开始,你创建的每个头文件中都可以包含一次pragma,如果你包含了所有正确的文件,那么你永远不会遇到未声明标识符的问题?@ManicCure
pragma once
只会防止重复声明。包括所有正确的文件是棘手的部分。问题是,如果包含太多错误依赖项,C++可以慢下来。如果您想提高编译速度,请阅读有关预编译头的内容。但这是另一个问题。