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

现在我有另外两个标题,我定义如下:

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

第二个标题:

#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 回答