0

だから私は、次のように保護されている「header.h」としましょう:

#ifndef __HEADER1_H
#define __HEADER1_H
//type and function def 
typedef struct
{
  float r; //process noise
  float k; //process gain
}state_t;

int get_state(state_t* state, float b);

#endif

これで、次のように定義した他の 2 つのヘッダーができました。

 #ifdef __HEADER2_H
 #include "header.h"
//function def
 #endif

2 番目のヘッダー:

#ifdef __HEADER3_H
//function
//the reason it is done this way is for cnditional compiling such that if the caller  

//defines __HEADER3_H t this file won't be included.
#include "header.h"
#endif

コンパイラは、header2 と header3 のソース実装で、header.h で定義された型と関数が検出されなかったと不平を言っているのではないかと疑っていました。そのため、ソース ファイルにも header.h を含めました。現在、リンカは、header.h で定義されている関数が複数定義されていると不平を言っています。私の理解では、header.h は ifndef によって保護されているため、一度しか含まれないため、問題は発生しません。ここに私が得ているエラーがあります:

Symbol get_state multiply defined(by kalman.o and dsp.o)

私が異常に間違ったことをしている可能性はありますか?

4

2 に答える 2

2
#ifndef __HEADER1_H
#define __HEADER_H

問題は、ガード ( __HEADER_H) がチェックしているもの ( ) と異なることです__HEADER1_H。これらを両方とも同じ値にします。

于 2012-10-03T02:25:22.630 に答える
1

ヘッダー ファイルの典型的な「ガード」は次のとおりです。

myheader.h:

#ifndef _MYHEADER
#define _MYHEADER
<do stuff>
#endif

オプションで myheader.h が含まれている場合は、次のことができます。

#ifndef _MYHEADER
#include "myheader.h"
#endif

これはオプションであり、基本的にはコンパイルのパフォーマンスを向上させるためだけです。

于 2012-10-03T02:29:47.553 に答える