PC Lint警告537:重复包含文件

时间:2011-09-26 12:50:25

标签: c lint pc-lint

如何从PC Lint处理此警告?

我在几个档案中有#include <GenericTypeDefs.h>。 PC Lint向我显示消息Warning 537: Repeated include file 'filepath\filename.h'如果我删除此声明,我无法编译。

如果可能,我想取消此警告。

您可以看到相同的报告here

这是我的代码,我的编译器发出警告:

checksum.h

#ifndef CHECKSUM_H
#define CHECKSUM_H

#include <GenericTypeDefs.h>

BOOL isCheckSumCorrect(const UINT8 *dataPointer, UINT8 len, UINT8 checkSumByte);

#ifdef  __cplusplus
extern "C" {
#endif

cryptography.h

#ifndef CRYPTOGRAPHY_H
#define CRYPTOGRAPHY_H

#include <GenericTypeDefs.h>

UINT8 encrypt(UINT8 c);
UINT8 decrypt(UINT8 c);

#ifdef  __cplusplus
extern "C" {
#endif

crc8.h

#ifndef CRC_H
#define CRC_H

#include <GenericTypeDefs.h>

UINT8 generateCRC(const UINT8 *ptr, UINT8 Len);
BOOL isCRCValid(const UINT8 *ptr, UINT8 Len, UINT8 CRCChar);

#ifdef  __cplusplus
extern "C" {
#endif

显然,我没有在#include <GenericTypeDefs.h>checksum.ccryptography.c上重复crc8.c

3 个答案:

答案 0 :(得分:6)

忽略它

如果你有包含警卫,这是一个虚假警告,可以(应该)被忽略。我们使用包含保护,因为允许多次包含文件是一种很好的做法,可以实现更灵活的代码,防止人为错误,并避免在#include语句中具有顺序重要性。如果你想知道为什么会这样,请继续阅读。

多个包含不是问题因为你有包含警卫。

由于这些.h文件都非常相关,我猜你把所有三个都包含在同一个文件中,可能是main.c

#include "checksum.h"
#include "cryptography.h"
#include "crc8.h"

main () { /* Do Stuff */ }

这将扩展(当然减去评论):

// CHECKSUM_H is not defined, so the preprocessor inserts:
#include <GenericTypeDefs.h>
BOOL isCheckSumCorrect(const UINT8 *dataPointer, UINT8 len, UINT8 checkSumByte);

// CRYPTOGRAPHY_H is not defined, so the preprocessor inserts:
#include <GenericTypeDefs.h>
UINT8 encrypt(UINT8 c);
UINT8 decrypt(UINT8 c);

// CRC_H is not defined, so the preprocessor inserts: 
#include <GenericTypeDefs.h>
UINT8 generateCRC(const UINT8 *ptr, UINT8 Len);
BOOL isCRCValid(const UINT8 *ptr, UINT8 Len, UINT8 CRCChar);

main () { /* Do Stuff */ }

所以是的,#include <GenericTypeDefs.h>确实会在预处理器步骤中的某个点出现多次。表面上看,该文件看起来像:

#ifndef GENERIC_TYPE_DEFS_H
#define GENERIC_TYPE_DEFS_H

#define UINT8 unsigned char

#ifdef  __cplusplus
extern "C" {
#endif

因此,经过更多的预处理后,我们之前扩展的位(减去注释)变为:

// GENERIC_TYPE_DEFS_H is not defined, so the preprocessor inserts:
#define UINT8 unsigned char
BOOL isCheckSumCorrect(const UINT8 *dataPointer, UINT8 len, UINT8 checkSumByte);

// GENERIC_TYPE_DEFS_H IS defined, so the preprocessor inserts nothing.
UINT8 encrypt(UINT8 c);
UINT8 decrypt(UINT8 c);

// GENERIC_TYPE_DEFS_H IS defined, so the preprocessor inserts nothing.
UINT8 generateCRC(const UINT8 *ptr, UINT8 Len);
BOOL isCRCValid(const UINT8 *ptr, UINT8 Len, UINT8 CRCChar);

main () { /* Do Stuff */ }

进一步预处理(未显示)在整个代码中复制#define

如果你注意到其他预处理器和linter警告,你可以保证包含警戒

如果任何.h文件缺少标准包含警卫,则linter将警告您(错误451和967)。如果乘法包含的GenericTypeDefs.h没有包含保护,编译器将警告重复的符号定义。如果没有,请创建自己的MyGenericTypeDefs.h或切换到<stdint.h>标头,这是C标准的一部分,并提供与GenericTypeDefs.h类似的功能。

警告:未来的解决方法不好

如果您真的坚持修复警告而不是忽略它,则必须从每个#include <GenericTypeDefs.h>文件中删除.h并在包含一个或多个这些文件之前输入一次,像这样:

checksum.c

#include <GenericTypeDefs.h>
#include "checksum.h"

cryptography.c

#include <GenericTypeDefs.h>
#include "cryptography.h"

crc.c

#include <GenericTypeDefs.h>
#include "crc.h"

main.c

#include <GenericTypeDefs.h>
#include "checksum.h"
#include "cryptography.h"
#include "crc8.h"

main () { /* Do Stuff */ }

这不推荐,因为它会为你带来更多的工作,并且你有更多的机会犯错误(没有冒犯,但你只是人类而预处理器不是)。相反,只需要求预处理器完成其工作并按照设计方式使用包含保护。

答案 1 :(得分:0)

你链接的文章解释说它更像是PCLint的怪异,应该是注意而不是警告。

忽略它/禁用它。

答案 2 :(得分:-1)

您可以使用以下选项禁用该标题的警告:

-efile(537,GenericTypeDefs.h)

并将其添加到您的Lint配置中(如果有的话)。