我有这样的项目,其中包含1.c
2.c
和mygost.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:添加static
或inline
没有效果。
答案 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下编译你的代码并且它不能编译,因为某些未知类型要么在你的实际项目的其他地方定义,要么也可能是你的问题的原因。尝试重写为一个自包含的可编译示例。如果你愿意,你可以查看我刚刚开始的一个有价值的项目,看看另一个堆栈溢出问题你可以查看想法。