無視してください
警備員を含めている場合、これは偽の警告であり、無視することができます(無視する必要があります)。インクルードガードを使用するのは、ファイルを複数回インクルードできるようにすることは良い習慣であり、より柔軟なコードを有効にし、人為的エラーを防ぎ、#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.h
multiply-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 */ }
これはお勧めできません。これにより、作業が増え、間違いを犯す可能性が高くなります(違反はありませんが、あなたは人間であり、プリプロセッサはそうではありません)。代わりに、プリプロセッサにその仕事をしてもらい、インクルードガードを設計どおりに使用するように依頼してください。