ggr*_*grr 6 c c++ macros include
我知道C或C++代码通常需要使用这样的包含守卫:
#ifndef __A__H__
#define __A__H__
class A{
};
#endif
Run Code Online (Sandbox Code Playgroud)
并且为了加快编译时间,在其他cpp(例如:B.cpp)中,它可以改变
#include "A.h"
Run Code Online (Sandbox Code Playgroud)
至:
#ifndef __A__H__
#include "A.h"
#endif
Run Code Online (Sandbox Code Playgroud)
但问题是为什么编译器不会自动添加或生成包含保护,因此如果通常需要包含保护,程序员为什么需要手动添加呢?
Jon*_*ler 10
有时候生成头部保护是绝对不正确的.标准包含一个例子:<assert.h>C和<cassert>C++.
重新包括这些标头的效果取决于(重新)包含标头时NDEBUG宏的状态.写下来是合法的:
#undef NDEBUG
#include <assert.h>
…code using assert…
#define NDEBUG 1
#include <assert.h>
…more code using assert…
Run Code Online (Sandbox Code Playgroud)
如果编译器自动生成标头保护,那将无法正常工作.因此,编译器不会自动生成标题保护.
顺便提一下,用户代码不应使用以双下划线或下划线大写字母开头的标题保护宏名称.这些名称保留用于实施.在C++中,任何用户定义的名称都不能合法地包含双下划线.使用更像是:
#ifndef A_H_INCLUDED
#define A_H_INCLUDED
…body of header…
#endif
Run Code Online (Sandbox Code Playgroud)