首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要澄清#ifndef #定义

需要澄清#ifndef #定义
EN

Stack Overflow用户
提问于 2016-04-25 09:14:17
回答 4查看 1.1K关注 0票数 0

我正在工作的代码有多个头和不同类的源文件,face.cc, face.hh, cell.cc, cell.hh edge.cc edge.hh和头包含如下所示,

代码语言:javascript
复制
#ifndef cellINCLUDED
#define cellINCLUDED

#ifndef faceINCLUDED
#define faceINCLUDED

我看透了http://www.cplusplus.com/forum/articles/10627/,并看到了写包含守卫的方法是

代码语言:javascript
复制
#ifndef __MYCLASS_H_INCLUDED__
#define __MYCLASS_H_INCLUDED__

所以,在我正在处理的上面的代码中,编译器会自动理解它在寻找face.hhcell.hh文件吗?

更好的问题是:写__CELL_H_INCLUDED__cellINCLUDED一样吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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,有可能有一天,有人会在翻译单元中使用它作为标识符。

票数 3
EN

Stack Overflow用户

发布于 2016-04-25 09:24:10

预处理器的定义没有特殊的意义。唯一的要求是它们在各个模块中保持唯一,这就是为什么文件名通常是它们的一部分。

特别是,防止双重包含的机制不是“在”语言中“烘焙”的,而只是使用预处理器的机制。

尽管如此,现在每一个值得注意的编译器都支持#pragma once,您可能会同意这一点。

票数 1
EN

Stack Overflow用户

发布于 2016-04-25 09:24:25

正如您所引用的链接所述,“编译器没有自己的大脑”--因此,为了回答您的问题,编译不知道涉及哪些特定文件。它甚至不明白“__cellINCLUDED”在概念上与特定文件有任何关系。

相反,包含保护只会防止包含在其打开的#ifndef和关闭#endif之间的逻辑被多次包含。作为程序员,You告诉编译器不要多次包含该代码--编译器不会单独执行任何“智能”操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36836337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档