#ifndefの使い方

1181 ワード

背景:
最近、yolov 5のtensorrtのインタフェースを書く必要があり、コードを見ている間にいくつかの問題に遭遇し、記録し、毎日少し進歩しています.
困惑点:
以下に示すように、コードにはなぜこのような構造があるのでしょうか.
     test.h ,          ,  :
#ifndef __TEST_H
#define __TEST_H
"
...... #  
......
"
         :
#endif

理由:
重複参照の防止
例:
あなたのプロジェクトにはa.cpp,b.h,c.h,d.hの4つのファイルがあるとします.a.cppの頭部は:#include“b.h”#include“c.h”b.hとc.hの頭部はすべて:#include“d.h”であり、d.hにはclass Dの定義がある.このように、コンパイラがa.cppをコンパイルするときは、まず#include“b.h”に基づいてb.hという問題をコンパイルし、b.hの中の#include“d.h”に基づいて、d.hというファイルをコンパイルし、このようにd.hの中のclass Dをコンパイルします.そしてa.cppの2番目の文#include“c.h”に基づいて、c.hをコンパイルして、最終的にはd.hの中のclass Dを見つけることができますが、class Dは前にコンパイルしたので、再定義エラーを報告します.ifndef/define/endifを加えると、このような再定義エラーを防止できます.
したがって、ヘッダファイルが複数のファイルに参照されるかどうかにかかわらず、ファイルの内容をifndefとendifに配置します.  
使用方法:
一般的なフォーマット:
#ifndef      
#define      
......   
......   
#endif    

理論的には自由に命名できますが、各ヘッダファイルのこの「識別」は一意であるべきです.標識の命名規則は一般的にヘッダファイル名が大文字で、前後に下線を引き、ファイル名の「.」下線にもなります.例えば、stdio.h   
#ifndef   _STDIO_H_   
#define   _STDIO_H_   
......   
#endif 

参考資料:
https://blog.csdn.net/yapingmcu/article/details/8027473