#pragma once
不是标准的,但被 gcc 和 VC++ 等编译器支持。它有助于避免包含防护。
但是,在内部,编译器是否为#pragma once
? 如果不是,编译器如何确保这样的头文件只包含一次?
我确信它就像include_once
在 PHP 中一样工作 - 有一个“已包含的文件”表。在这种情况下,编译器会在列表中查找要包含的文件,如果文件已经包含,则不要再次包含它。如果编译器在处理文件时看到 a #pragma once
,则将此文件添加到“已包含的文件”中。
所以它在细节层面上与包含保护不一样,但它与包含保护具有相同的效果。它还降低了代码的可移植性,因为有很多编译器不支持这一点。
不,编译器不会添加包含防护,但这不重要,因为它不会再次包含同一个文件,所以它永远不会改变首先评估这些防护。
在文件“file.h”中添加“#pragma once”时,编译器帮助我们确保“file.h”只会被打开一次。
但是如果我有一个名为“file_copy.h”的“file.h”的副本,如果它被包含,它将被打开。