我正在工作的代码有多个头和不同类的源文件,face.cc, face.hh, cell.cc, cell.hh edge.cc edge.hh和头包含如下所示,
#ifndef cellINCLUDED
#define cellINCLUDED
#ifndef faceINCLUDED
#define faceINCLUDED我看透了http://www.cplusplus.com/forum/articles/10627/,并看到了写包含守卫的方法是
#ifndef __MYCLASS_H_INCLUDED__
#define __MYCLASS_H_INCLUDED__所以,在我正在处理的上面的代码中,编译器会自动理解它在寻找face.hh或cell.hh文件吗?
更好的问题是:写__CELL_H_INCLUDED__和cellINCLUDED一样吗?
发布于 2016-04-25 09:27:40
#ifndef __MYCLASS_H_INCLUDED__ # __MYCLASS_H_INCLUDED__ 所以,在我正在处理的上面的代码中,编译器会自动理解它在寻找face.hh或cell.hh文件吗?
不,编译器不会自动理解你的意思。
真正发生的是,在编译translation unit时,编译器会保存一个全局定义宏的列表。因此,如果宏__MYCLASS_H_INCLUDED__还不存在,那么您要做的就是定义它。
如果定义了该宏,则该#ifndef直到#endif才会被实际编译器解析。因此,您可以测试该宏是否存在,以确定编译器是否解析了该头文件以将其包含一次,并且只在翻译单元中包含了一次。这是因为编译器将每个翻译单元编译为)。
请参阅guard
写
__CELL_H_INCLUDED__和cellINCLUDED一样吗?
是的是..。有些人更喜欢使用带下划线、前缀和后缀的宏作为包含守卫的宏,因为它们被用作标识符的概率极低.但是再次,underscore could clash with the compiler..。
我更喜欢这样的东西:CELL_H_INCLUDED
如果您使用cellINCLUDED,有可能有一天,有人会在翻译单元中使用它作为标识符。
发布于 2016-04-25 09:24:10
预处理器的定义没有特殊的意义。唯一的要求是它们在各个模块中保持唯一,这就是为什么文件名通常是它们的一部分。
特别是,防止双重包含的机制不是“在”语言中“烘焙”的,而只是使用预处理器的机制。
尽管如此,现在每一个值得注意的编译器都支持#pragma once,您可能会同意这一点。
发布于 2016-04-25 09:24:25
正如您所引用的链接所述,“编译器没有自己的大脑”--因此,为了回答您的问题,编译不知道涉及哪些特定文件。它甚至不明白“__cellINCLUDED”在概念上与特定文件有任何关系。
相反,包含保护只会防止包含在其打开的#ifndef和关闭#endif之间的逻辑被多次包含。作为程序员,You告诉编译器不要多次包含该代码--编译器不会单独执行任何“智能”操作。
https://stackoverflow.com/questions/36836337
复制相似问题