我不想使用头文件,直接用include "User.cpp"为什么会出错呢?

良少
博客专家认证
2006-05-08 03:49:17


我觉得C++的头文件,完全没有必要。 白白增加了复杂度。 我想只有源文件,不用头文件,然后使用# include "User.cpp"
但是,总是抱错! “找到一个或多个重定义的符号”


请问,该怎么办? 有办法不用头文件,只用一个.cpp源文件吗?
...全文
408 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
良少 2006-05-10
  • 打赏
  • 举报
回复
.Net和 Java都没有头文件, 日子都过得很舒服啊!
头文件,就是一个语言设计的败笔!
aniude 2006-05-10
  • 打赏
  • 举报
回复
我觉得思维的创新不是这样子的吧
良少 2006-05-09
  • 打赏
  • 举报
回复
i_noname(晚九朝五) ( ) 信誉:96


楼主如果做过项目,就会明白不要头文件这种想法有多疯狂
===================

世界上所有的语言中,只有C/C++是将代码的定义和实现分开放在2个文件中的。
这就是冗余,完全没必要。 一个小小的类,我还要去几个文件中找到代码,多浪费呀!
而且,头文件又不是接口, 我不可能写几个.cpp的实现文件, 这样又要报错!

希望以后C/C++该版时能够把头文件去掉。 虽然借助于现代IDE,生成一个头文件并不费事, 不过头文件总是一个废物, 我看它不爽!
simulationz 2006-05-09
  • 打赏
  • 举报
回复
直接包含某个文件,到底是h文件还是cpp文件,编译器都能识别。但最好是h文件。
写C/C++程序,需要区分三个概念,声明(declaration)、定义(definition)和实现(Implementation),对变量如此,对类也是如此。区分了他们,也就不需要一定要执着地写在一起了。
定义和实现写在一起,如果在整个工程项目中只被包含一次,写在某个cpp文件,可以编译通过,其它情况,就不能保证了。可能出现一个或多个重定义的符号的编译错误。
i_noname 2006-05-09
  • 打赏
  • 举报
回复
楼主如果做过项目,就会明白不要头文件这种想法有多疯狂
xzgyb 2006-05-09
  • 打赏
  • 举报
回复
编译器是以cpp文件为单位为编译的
如果你的cpp中有外部连接的实体定义
即使include一次user.cpp也出错
因为编译器还要编译user.cpp一次
除非你把这个user.cpp不放在工程之中
或者在makefile中不作编译

zmrpro 2006-05-09
  • 打赏
  • 举报
回复
没有具体试过,

我想可能是定义出错误;
waterflier 2006-05-09
  • 打赏
  • 举报
回复
.cpp 文件在C++ 中是约定用来写各种东西的实现的地方.
除非你的这个.cpp文件发挥的是.h文件的功能,里面都是各种声明而且不包含任何定义,那用来#include是你的个人爱好,自然没有问题(最好还有一个爱好是把实现写在.h文件里,然后你编译的时候都是编译.h文件,好邪恶).

如果.cpp文件中有函数实现和变量定义的代码,sorry,这个.cpp文件是不能用来#include的.不管是否有写
#ifndef _User_h
#define _User_h
//User.cpp的具体内容
#endif
这样的预编译判断.(这只能让你通过编译).只要你这个.cpp文件被#include过两次,最后LINK这一关是无论如何都过不了的.

Wolf0403(完美废人·不配奢求幸福) 想说什么?请教.
navi_dx 2006-05-08
  • 打赏
  • 举报
回复
不去思考研究,一切都是复杂的
为了这句话,顶一下
wanlyf 2006-05-08
  • 打赏
  • 举报
回复
ding
Wolf0403 2006-05-08
  • 打赏
  • 举报
回复
$ cat test.cpp
struct T {
void _ (){}

};
int main() {
T t;
t._();
return 0;
}
$ cat main.cpp
#include "test.cpp"
$ g++ main.cpp -o main
$ ls -l main
-rwx------ 1 u4120299 student 11517 2006-05-08 22:20 main
$ ./main
$ echo $?
0
$

不去思考研究,一切都是复杂的。。
IhaveGotYou 2006-05-08
  • 打赏
  • 举报
回复
正如上搂的:
在单元User.cpp中多加几行如下:
#ifndef _User_h
#define _User_h
//User.cpp的具体内容
#endif

以后其他单元想怎么引入都可以
gernal_dn 2006-05-08
  • 打赏
  • 举报
回复
user.cpp已经在project里面了,再include一次,当然会重名了!
不过如果你每个文件都这样干的话,就没问题了:
#ifndef __user_cpp__
#define __user_cpp__
//文件具体内容...
//
//
#endif
blh 2006-05-08
  • 打赏
  • 举报
回复
可以那么做但不建议
需要看看你的源代码,否则无法判断是什么问题
铖邑 2006-05-08
  • 打赏
  • 举报
回复
这样做是可以的,但是不推荐。你在工程里面不用加"User.cpp"文件就可以了。
lonelyforest 2006-05-08
  • 打赏
  • 举报
回复
呵呵, 那就是重包含了。 如果加入到一个工程里面, 应该没有问题的。
lbing7 2006-05-08
  • 打赏
  • 举报
回复
不错才怪

详见教科书如:<C++程序设计语言>中的:文件的组织一章
navi_dx 2006-05-08
  • 打赏
  • 举报
回复
当然可以不用头文件,但是include "XXX.cpp"也太离谱了吧,你这样更复杂,把定义和实现混在一起,编译器分别编译每个源文件然后连接,你这样会把一个源文件编译两次

64,318

社区成员

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

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