我正在尝试使用Code::Blocks IDE创建一个C++类,其中有一个名为“Guard block”的字段。我已经搜索过但没有找到任何有用的信息。这个字段是用来做什么的?谢谢。
我正在尝试使用Code::Blocks IDE创建一个C++类,其中有一个名为“Guard block”的字段。我已经搜索过但没有找到任何有用的信息。这个字段是用来做什么的?谢谢。
保护块被用来防止同一编译单元(C++文件)多次包含头文件。它们看起来像这样:
// Foo.h
#ifndef INCLUDE_FILE_NAME_HERE_H_
#define INCLUDE_FILE_NAME_HERE_H_
class Foo
{
};
#endif
如果你在多个文件中包含相同的文件,你将会遇到多重定义错误。在小型项目中不需要使用include guards,但在任何中大型项目中都变得至关重要。我经常在我编写的头文件中使用它。
守卫块用于防止在单个翻译单元中多次包含头文件。当您包含许多头文件时,这通常是一个问题,而这些头文件反过来又包含常见的标准头文件。
同一文件的多重包含的问题在于它导致相同的符号被多次定义。
守卫子句可以使用#define
和#ifdef
语句处理,但使用非标准的、普遍存在的#pragma once
则更简单。
// foo.h
#pragma once
int foo(void);
// etc.
#IFNDEF MYTHING \n #DEFINE MYTHING \n #pragma once
在所有可能快速的编译器上都很快(请确保 ifdef 放在第一位)。 - Mooing Duck#pragma once
,不支持该指令的编译器会报错吗? - Seth Carnegie#IFNDEF
开头,并且如果以此开头,则第二次不会再次“触及”该文件。理解#pragma once
的编译器也会这样做,但是pragma
不必是文件中的第一件事。根据C标准,不理解#pragma
的编译器需要忽略它。愚蠢的编译器将打开文件,并被#IFNDEF
(第二次)阻止。 - Mooing Duck