同一个结构体在多个头文件引用重定义问题

R-I-P 2012-12-22 11:18:28
一个结构体
列如
struct book {
int value;
char name【50】;
};

要在 1.h 2.h 3.h 头文件使用
在1.h 2.h 3.h 使用
#ifndef _HEADERNAME_H
#define _HEADERNAME_H
......
#endif


然后在主函数中 如main.c中 要包含1.h 2.h 3.h
编译报错 重定义结构体

问题是因为1.h 2.h 3.h中即使使用#ifndef 那么结构体肯定在1.h 2.h 3.h被定义
然而在main.c中 包含1.h 2.h 3.h 当然是重定义了结构体

这样应该怎么办?
...全文
1325 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lee_鹿游原 2012-12-23
  • 打赏
  • 举报
回复
引用 10 楼 Monster88Ra 的回复:
但是 往其中继续添加h以及c 出现同样错误,函数名字一至,这又是怎么回事 http://download.csdn.net/detail/monster88ra/4918822 工程文件 谢谢
你的工程 没有入口主函数..main(),新建个.CPP,int main(){.....}不理解的话,自己百度这方面的知识。
蒋晟 2012-12-23
  • 打赏
  • 举报
回复
#pragma once
R-I-P 2012-12-23
  • 打赏
  • 举报
回复
但是 往其中继续添加h以及c 出现同样错误,函数名字一至,这又是怎么回事 http://download.csdn.net/detail/monster88ra/4918822 工程文件 谢谢
lee_鹿游原 2012-12-23
  • 打赏
  • 举报
回复
你的e_map.cpp 和main.cpp 里面main函数重复,控制台入口函数只能有一个main(); 其中改一下名字。 还有你的updata.h和.cpp, 里面的.h的函数名和.cpp函数名不一样。

.H: void updata(Road * head);
.CPP: void update(Road*head);
而你在e_map.cpp里调用的是updata。  找不到函数实现,所有报错。 名字一致就行。
R-I-P 2012-12-23
  • 打赏
  • 举报
回复
http://download.csdn.net/detail/monster88ra/4918725 工程文件 谢谢了
lee_鹿游原 2012-12-23
  • 打赏
  • 举报
回复
引用 5 楼 Monster88Ra 的回复:
common.h按照 lile1234_show 做好了 重定义的问题解决了,但是,却出现了LNK2019错误 具体是 无法解析的外部符号 "void __cdecl updata(struct Road *)" (?updata@@YAXPAURoad@@@Z),该符号在函数 _main 中被引用 我建了一个头文件为updata.h 其中包含了"co……
最好能把你的工程,扔上来
东大坡居士 2012-12-23
  • 打赏
  • 举报
回复
post your codes, and try to use a different function name, not same as your file name. you canuse updata_XXX()
R-I-P 2012-12-23
  • 打赏
  • 举报
回复
common.h按照 lile1234_show 做好了 重定义的问题解决了,但是,却出现了LNK2019错误 具体是 无法解析的外部符号 "void __cdecl updata(struct Road *)" (?updata@@YAXPAURoad@@@Z),该符号在函数 _main 中被引用 我建了一个头文件为updata.h 其中包含了"common.h" 而且声明了函数 其中 函数原型写在updata.cpp 并且包含了updata.h 但是编译却出错了 这是为什么???
lee_鹿游原 2012-12-23
  • 打赏
  • 举报
回复 1
新建一个common.h ,再包含试试 1.h,2.h,3.h 都include"common.h"

#ifndef _COMMON_H
#define _COMMON_H
struct book 
{
	int value;
	char name[50];
};
#endif
东大坡居士 2012-12-23
  • 打赏
  • 举报
回复
you can create a common header file: e.g.: header_common.h in this file define: #ifndef HEADER_COMMON_H #define HEADER_COMMON_H struct book { int value; char name【50】; }; #endif and in your three .h files include header_common.h file.
R-I-P 2012-12-23
  • 打赏
  • 举报
回复
请问 #pragma once与 #ifndef _HEADERNAME_H #define _HEADERNAME_H ...... #endif 有什么区别呢? 另外,使用#pragma once也是同样出现问题,问题原因也是一样
卖萌de猫 2012-12-23
  • 打赏
  • 举报
回复
引用 4 楼 lile1234_show 的回复:
新建一个common.h ,再包含试试 1.h,2.h,3.h 都include"common.h" C/C++ code ? 123456789 #ifndef _COMMON_H #define _COMMON_H struct book { int value; char name[50]; }; #endif
正解
R-I-P 2012-12-23
  • 打赏
  • 举报
回复
入口主函数在e-map.c里 将新加入的函数注释掉,程序是可以运行的
C++之程序结构,头⽂件,源代码⽂件 程序组织策略 程序组织策略 C++中建⽴代码⼯程时,通常包括三个部分:头⽂件,函数源代码⽂件,主程序源代码(即main()函数,可以调⽤函数源代码,完成程 序的整体流程与功能)。 头⽂件( 头⽂件(#include)常包含的内容: )常包含的内容: 函数原型 eg:void a(int temp); 使⽤ #define 或 const 定义的符号常量 结构声明 类声明 模板声明 内联函数 说明: 1. 通常情况下,多个函数可能同时包括上述某些相同内容。如果每个函数中都对该内容进⾏声明,想要修改该内容就需要同时修改上述全部 声明,对后⾯的维护造成不必要的⿇烦。为避免上述问题,可以将相关的内容放在 头⽂件中,这样,要修改内容时,只需要在头⽂件中做 ⼀次修改就可以。 2. 函数定义,变量声明不能放在头⽂件中。例如,如果⼀个头⽂件中包含某⼀函数定义,然后在其他两个⽂件(属于同⼀个程序)中包含该 头⽂件,则同⼀个程序将包含同⼀个函数的两个定义(内联函数是特例),发⽣冲突。变量声明同函数定义。 3. 结构声明(struct),类声明(class)本⾝并不创建变量,⽽只是在源代码⽂件中声明变量时,告诉编译器如何创建该结构变量。同 理,模板声明指⽰编译器如何⽣成与源代码中函数调⽤相匹配的函数定义。 4. const 变量和内联函数有特殊的链接属性,可以放在头⽂件中,不会引起问题。 函数源代码⽂件( 函数源代码⽂件(.cpp或 或.cc): ): 函数源代码⽂件中,主要存放头⽂件中函数原型的具体实现。 使⽤⽅法:编写程序的时候,如果需要使⽤这些函数,则只需包含头⽂件,并将函数源代码⽂件添加到项⽬列表或make列表中 (Linux)。 注:在IDE中不要将头⽂件加⼊到项⽬列表中,也不要在源代码⽂件中使⽤#include来包含其他源代码⽂件,这样将会导致多声明。

70,014

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧