【问题标题】:Multiple inclusion of header file error in CC中多次包含头文件错误
【发布时间】: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 都实现它,或者可能意味着这两个源文件实际上都包含实现(这也是一个很多)。

标签: c conditional-compilation


【解决方案1】:
#ifndef __HEADER1_H
#define __HEADER_H

问题是您的警卫 (__HEADER_H) 与您正在检查的 (__HEADER1_H) 不同。使这两个值相同。

【讨论】:

  • 而且您没有在第二个和第三个标题中显示必要的#define。您的第二个和第三个标题使用#ifdef 而不是#ifndef,并且没有所需的#define。此外,以_ 开头的标识符保留给实现;这些不太可能导致问题,但您应该使用像 HEADER1_H 这样的标识符。
  • 我在这里输入错误。在我的代码中,我使用了 __HEADER1.h。但好点基思。尽管错误仍然出现,但我在代码中修改了它。
【解决方案2】:

头文件的典型“守卫”是:

myheader.h:

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

可选地在包含 myheader.h 的地方,您可以这样做:

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

这是可选,基本上只是为了提高编译性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    相关资源
    最近更新 更多