C++ 需要澄清一下#pragma吗
我到处找,想弄清楚是什么 #布拉格语一次 事实上,对于我仍然存在的一些问题,我已经找到了,也无法找到明确的答案 做 #布拉格语一次 确保包含在其中的头文件只被调用一次,并且包含在所述头文件中的头文件尚未被包含?另外,如果只调用一次,是否意味着需要特定头的.cpp文件将无法访问它?如果头文件标记为 #布拉格语一次 并且包含在.cpp中,该头文件可以在其他地方再次使用吗 这些是我找不到的澄清。抱歉,如果有文档在某个地方澄清了这一点,但我真的找不到任何足够具体的东西。C++ 需要澄清一下#pragma吗,c++,pragma,precompiled-headers,preprocessor-directive,C++,Pragma,Precompiled Headers,Preprocessor Directive,我到处找,想弄清楚是什么 #布拉格语一次 事实上,对于我仍然存在的一些问题,我已经找到了,也无法找到明确的答案 做 #布拉格语一次 确保包含在其中的头文件只被调用一次,并且包含在所述头文件中的头文件尚未被包含?另外,如果只调用一次,是否意味着需要特定头的.cpp文件将无法访问它?如果头文件标记为 #布拉格语一次 并且包含在.cpp中,该头文件可以在其他地方再次使用吗 这些是我找不到的澄清。抱歉,如果有文档在某个地方澄清了这一点,但我真的找不到任何足够具体的东西。#pragma once仅在单个翻
#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,如果你包含了所有正确的文件,那么你永远不会遇到未声明标识符的问题?@ManicCurepragma once
只会防止重复声明。包括所有正确的文件是棘手的部分。问题是,如果包含太多错误依赖项,C++可以慢下来。如果您想提高编译速度,请阅读有关预编译头的内容。但这是另一个问题。