如何从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.c
和cryptography.c
上重复crc8.c
答案 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
。
如果任何.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配置中(如果有的话)。