【发布时间】:2012-10-03 02:23:09
【问题描述】:
所以我有一个头文件,比如说“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)
有没有可能我做错了什么?
【问题讨论】:
-
是的,请看下面的 cmets -- 你有几处错误。
-
第二个和第三个代码段你想做什么??
-
我现在在想,粘贴到实际的 header.h 文件中可能是有意义的(或者至少足以显示编译器抱怨的顶部、底部和至少一项) -- 避免进一步的拼写错误导致无法以有用的方式回答。
-
谢谢,我编辑并添加了错误。
-
“多重定义”错误并不意味着您要对函数进行两次删除(这是 header1.h 的多个包含项,正如您在此处粘贴的那样)。这意味着您已经实现了两次该功能 - 这可能意味着您在头文件中实现了它,导致 kalman.c 和 dsp.c 都实现它,或者可能意味着这两个源文件实际上都包含实现(这也是一个很多)。