纯C++,编译头文件包含问题

zhangwuji156 2009-03-30 12:24:04
在IDE中,不论是VC还是CB都可以,纯C++(如C-Free)就不可以,那这样怎么做?
main.cpp文件中
#include <stdio.h>
#include "Unit1.h"

int main(int argc, char *argv[])
{
Init();
printf("%d",i);
return 0;
}
unit1.h文件中
#ifndef MYUNIT1_H
#define MYUNIT1_H
int i;
void Init();
#endif
unit1.cpp文件中
#include "Unit1.h"
void Init()
{
i=99;
}

然后报错说Init();没有申明,
如果main.cpp中包含unit1.cpp,就行了,不过,经典的书籍讲过,不要在文件中包含.cpp文件,这样很不合理,但不包含怎么能让它找到Init函数呢?
...全文
370 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
路人乙2019 2009-05-20
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 zhangwuji156 的回复:]
果然,和我想的一样,必须把三个文件加一个工程里才行,这样谁都会,没问题,即使C++编译器当然也可以建立工程,但现在我想知道的,不建工程不行吗?
难道纯C++标准里规定多个文件一定要建个工程吗?
[/Quote]IDE要求要.怎么还不结贴?
madpc 2009-04-02
  • 打赏
  • 举报
回复
建议楼主学习makefile, 连linux编译都可以用makefile搞定
aaaa3105563 2009-03-31
  • 打赏
  • 举报
回复
学习··
liuwg9999 2009-03-31
  • 打赏
  • 举报
回复
你要让编译器知道它们是一起的,要能把它们联系起来啊,比如你在vc代码目录下放一个文件,但是没有加入到工程,那么编译器就不认为这个文件和其他的是一起的,所以也不会编译成同一个可执行文件
fox000002 2009-03-30
  • 打赏
  • 举报
回复
C-Free 没用过

用 VC,DevC++ 之类 IDE 的话,就是把文件全部加到项目中去

还有 lz 得把代码改改,见 2 楼
zhangwuji156 2009-03-30
  • 打赏
  • 举报
回复
dev-C++就是不一样,以为用C-free都没产生过.lib文件,这个产生了,我是彻底晕了,不知道C++的标准是什么了……
感觉用了5年C++,全白学了(大学四年,工作1年)
zhangwuji156 2009-03-30
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 fox000002 的回复:]



没有链接 uint1.o


[/Quote]
怎样链接?
用IDE用习惯了,还真不知道C++编译器不能自动链接,得手动,
zhangwuji156 2009-03-30
  • 打赏
  • 举报
回复
extern这个问题,我刚才在C++ builder区已经提问过了,那个我已经改了,现在的问题是init函数都找不到,extern导致int i的结果正不正确已经是其次了,
就算不为了我,也为了解开这个谜团,大家加把油呀
fox000002 2009-03-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zhangwuji156 的回复:]
大哥们,你们电脑上有没有C++编译器呀,不要用VC和CB,我又安了dev-c++,这个业界够标准吧,看它的报错

[Linker error] undefined reference to `Init()'
[/Quote]

没有链接 uint1.o

zhangwuji156 2009-03-30
  • 打赏
  • 举报
回复
大哥们,你们电脑上有没有C++编译器呀,不要用VC和CB,我又安了dev-c++,这个业界够标准吧,看它的报错

[Linker error] undefined reference to `Init()'
Paradin 2009-03-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fox000002 的回复:]
C/C++ code//unit1.h#ifndef MYUNIT1_H#defineMYUNIT1_Hexterninti;voidInit();#endif//unit1.cpp#include"Unit1.h"inti;voidInit()
{
i=99;
}//main.cpp#include<stdio.h>#include"Unit1.h"intmain(intargc,char*argv[])
{
Init();
printf("%d",i);return0;
}

[/Quote]
zhangwuji156 2009-03-30
  • 打赏
  • 举报
回复
难道逼我用dev c试一试
zhangwuji156 2009-03-30
  • 打赏
  • 举报
回复
我想哭,大家用C-free4.0试一试就知道了,很小的一个C++编译器,三个文件我都保存了,而且在同一目录下。不是U大小写的问题,用的是windows
fox000002 2009-03-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hairetz 的回复:]
#include "Unit1.h"

不会是U大写的问题吧,本来你只要包含了头文件,里面的声明肯定可以用的。
[/Quote]

windows 大小写不分

代码没问题,可能是 lz 自己的编译方法有问题
飞雁 2009-03-30
  • 打赏
  • 举报
回复
我认为错误可能有三种情况:
1、#include "Unit1.h" 应该为 #include "unit1.h"
2、main.cpp,unit1.h,unit1.cpp不在同一目录下。
3、在unit1.cpp中添加extern int i
VCRWX 2009-03-30
  • 打赏
  • 举报
回复
看所写的程序应该是没问题的,确实是只需要头文件即可.在你说的纯C++中出错,你是否对问题描述的不清楚,在生成可执行文件的过程中,你可能没有把main.cpp unit1.cpp一起编译,如故你只编译main.cpp,编译过程中是不会出错的,但连接是会 报Init()没有定义的错误
  • 打赏
  • 举报
回复
#include "Unit1.h"

不会是U大写的问题吧,本来你只要包含了头文件,里面的声明肯定可以用的。
AZHANG00000 2009-03-30
  • 打赏
  • 举报
回复
LZ所谓的纯C++是什么意思??在LINUX下?应该是你的工程维护有问题。也就是你的MAKEFILE是有问题的,或者你编译用的命令的参数不对
zhangwuji156 2009-03-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 chin_chen 的回复:]
包含头文件即申明文件就可以了,但是那个申明文件要写个实现文件。

你包含是包含申明文件就可以。不必包含实现文件了。
[/Quote]
不包含报错呀,说Init(); 没有申明,
fox000002 2009-03-30
  • 打赏
  • 举报
回复
//unit1.h
#ifndef MYUNIT1_H
#define MYUNIT1_H

extern int i;

void Init();

#endif

//unit1.cpp
#include "Unit1.h"

int i;

void Init()
{
i=99;
}

// main.cpp
#include <stdio.h>
#include "Unit1.h"

int main(int argc, char *argv[])
{
Init();
printf("%d",i);
return 0;
}

加载更多回复(8)

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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