包含标题时的多重定义错误(如何在c中添加标题?)

时间:2013-12-01 17:52:46

标签: c header header-files

我有这样的项目,其中包含1.c 2.cmygost.h个文件。

//mygost.h  looks this way

#ifndef MYGOST_H_
#define MYGOST_H_
#include <stdint.h>


uint8_t transl_table(uint8_t in, uint8_t n) {
return tbl[n][in];
}

const char *get_filename_ext(const char *filename) 
{
  const char *dot = strrchr(filename, '.');
  if(!dot || dot == filename) return "";
  return dot + 1;
}
#endif

//1.c 
#include <malloc.h>
#include "mygost.h"
// here we call defined before functions

//2.c 
#include <malloc.h>
#include "mygost.h"
// here we call defined before functions

如果我只在一个.c文件中包含此标题,那么一切都会好的。否则我会得到const char *get_filename_ext(const char *filename)函数的多重定义错误以及标题中的所有其他函数。另外,我根本不在代码中重新定义这些函数。不知道如何解决这个问题。

我使用QNX Momentics工具套件,它有自己的编译器(http://www.qnx.com/products/tools/qnx-momentics.html),但就我所知,它的工作方式与gcc类似。

UPD1:编译器提供此类错误

Severity and Description    Path    Resource    Location    
2.c: multiple definition of `get_filename_ext'      GostQnx line 0

..........
make[2]:***[C:/ide-4.5-workspace/GostQnx/x86/o-g/GostQnx_g] Error1 GostQnx line 0
make[2]:***[C:/ide-4.5-workspace/GostQnx/x86/o/GostQnx] Error1 GostQnx  line 0
first defined here  GostQnx mygost.h    line 16
................

multiple definition of `get_filename_ext'GostQnx mygost.h   line 151  
..........

UPD2:添加staticinline没有效果。

1 个答案:

答案 0 :(得分:2)

您不应在.h文件中定义函数。错误很可能是缺少函数原型const char *get_filename_ext(const char *);

(编辑以下评论)

  //mygost.h  looks this way

  #ifndef MYGOST_H_
  #define MYGOST_H_
  #include <stdint.h>


  extern uint8_t transl_table(uint8_t in, uint8_t n);
  extern const char *get_filename_ext(const char *filename); 

  #endif

  //mygost.c  looks this way

  #include "mygost.h"


  extern uint8_t transl_table(uint8_t in, uint8_t n) {
  return tbl[n][in];
  }

  extern const char *get_filename_ext(const char *filename) 
  {
    const char *dot = strrchr(filename, '.');
    if(!dot || dot == filename) return "";
    return dot + 1;
  }

当你在1.c中包含时,编译器会声明该函数并对其原型进行假设,因为它没有定义。并且第二次包含在2.c中也是如此。通常的方法是在mygosh.h中声明一个函数原型,并将实际的函数声明放在包含实现细节的mygosh.c中。

请记住,我只是根据你的例子重写了(例如我没有更正trans1_table中未声明的变量)

从编译器获得完整的输出将有助于更精确。作为编译器和平台(例如:uccntu 12.04下的gcc 4.7)。

另外,我尝试使用gc 4.7在fedora 19下编译你的代码并且它不能编译,因为某些未知类型要么在你的实际项目的其他地方定义,要么也可能是你的问题的原因。尝试重写为一个自包含的可编译示例。如果你愿意,你可以查看我刚刚开始的一个有价值的项目,看看另一个堆栈溢出问题你可以查看想法。

https://gitorious.org/c-cli-rubix-cube