需要对#pragma进行一次澄清

时间:2014-02-18 03:00:55

标签: c++ pragma precompiled-headers preprocessor-directive

我到处搜索了一些关于什么的澄清     #pragma一次 对于我仍然存在的一些问题,实际上并且找不到明确的答案。

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

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

3 个答案:

答案 0 :(得分:7)

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

您仍然可以从其他.cpp再次添加它。

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

#pragma曾经确保它所包含的头文件只被调用一次,因为尚未包含所述头文件中包含的标题吗?

该pragma不会影响其他标头。如果带有编译指示'a.h'的标题包含'b.h',则'b.h'可以通过第三个标题或直接包含在内。

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

您可以根据需要随时随地添加标题。

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

是的,这是标题的常规做法。


捕获的地方在哪里?

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

pragma once的一个好处是它可以让你免受错误的影响,例如有2个头文件偶然拥有相同的哨兵宏。当2个头文件具有相同的文件名和相同的宏名称编码样式时,就会发生这种情况。