如果没有直接包含h文件,如何发出警告

时间:2016-08-06 21:56:41

标签: c++ c include warnings

假设我有几个“h”文件:

First.h

struct FirstStruct { /* Stuff */ };
/* Other stuff */

Second.h

#include "First.h"
struct SecondStruct { 
  FirstStruct member; 
  /* More other stuff */ 
};
/* Even more other stuff */

Third.h:

#include "Second.h"

FirstStruct foo(void);
/* Other functions */

如果您注意到Third.h没有直接获得FirstStruct的定义(即包括First.h),但是因为Second.h包含了它。问题是,当开发人员确定SecondStruct并不真正需要FirstStruct时,它需要半等效结构OtherStruct,然后将include取出到First.h .. ....现在使用Third.h的任何东西都不起作用。

是否有任何半标准编译器选项在您依赖其他h文件时警告您?

2 个答案:

答案 0 :(得分:2)

如果你有标题保护,文件"First.h"的标题保护是FIRST_HEADER_H,你可以做类似的事情

#ifndef FIRST_HEADER_H
/*warning*/
#pragma message("FREE ADVICE: You should include The file: First.h")
#endif

主要编制者support这个。

此外,我认为您应该阅读self contained headers,其中说明使用first.h(本示例中的 )的所有文件都应包含first.h所以{{ 1}}应该改为阅读:

third.h

答案 1 :(得分:0)

通过发现您的程序不再编译来检测此方案。

然后你将#include "First.h"添加到Third.h中(正如你应该首先做的那样 - 是的,即使你也包括Second.h)并解决了您的问题跟踪系统。

没有编译器警告您可以打开以指示可能有一天会出现此问题。 C ++编译器非常希望某些符号只能通过标题间接;尽管在你自己的代码中故意这样做是不好的做法,如果你使用任何库(包括标准库),这样的警告会使编译非常嘈杂。

您可以采取的唯一先发制人的步骤是在您的同行中进行仔细的代码审查,以及允许有时间修复意外错误的项目管理结构。

不可否认,这有点烦人。