5

PC Lintからのこの警告に対処するにはどうすればよいですか?

私はいくつかのファイルに#include <GenericTypeDefs.h>。PC Lintは、Warning 537: Repeated include file 'filepath\filename.h'この宣言を削除するとコンパイルできないというメッセージを表示します。

可能であれば、この警告を抑制したいと思います。

あなたはここで報告された同じものを見ることができます。

これは私のコードであり、私のコンパイラは警告を発します:

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

4

3 に答える 3

7

無視してください

警備員を含めている場合、これは偽の警告であり、無視することができます(無視する必要があります)。インクルードガードを使用するのは、ファイルを複数回インクルードできるようにすることは良い習慣であり、より柔軟なコードを有効にし、人為的エラーを防ぎ、#includeステートメントに順序の重要性がないようにするためです。これが当てはまる理由を知りたい場合は、読み進めてください。

インクルードガードがあるので、複数のインクルードは問題になりません。

これらの.hファイルはすべてかなり関連しているので、3つすべてを同じファイルのどこかに含めると思います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標準のインクルードガードがないファイルがある場合、リンターは警告します(エラー451および967) 。GenericTypeDefs.hmultiply-includedにincludeガードがない場合、コンパイラーは重複するシンボル定義について警告します。そうでない場合は、独自に作成するか、C標準の一部であり、と同様の機能を提供するヘッダーにMyGenericTypeDefs.h切り替えます。<stdint.h>GenericTypeDefs.h

警告:先の悪い回避策

警告を無視するのではなく修正することを本当に主張する場合は、次のように、これらのファイルの1つ以上が含まれる前に#include <GenericTypeDefs.h>、各ファイルから削除して1回入力する必要があります。.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 */ }

これはお勧めできません。これにより、作業が増え、間違いを犯す可能性が高くなります(違反はありませんが、あなたは人間であり、プリプロセッサはそうではありません)。代わりに、プリプロセッサにその仕事をしてもらい、インクルードガードを設計どおりに使用するように依頼してください。

于 2011-09-26T14:41:30.637 に答える
1

オプションを使用して、そのヘッダーのみの警告を無効にすることができます。

-efile(537,GenericTypeDefs.h)

Lint構成がある場合は、それをLint構成に追加します。

于 2011-09-26T14:05:34.183 に答える
0

あなたがリンクした記事は、それがPCLintの奇妙なものであり、警告ではなくメモであるべきだと説明しています。

無視するか無効にするだけです。

于 2011-09-26T14:12:11.657 に答える