社区
C语言
帖子详情
没有头文件,为什么能运行?
lhbgyl
2006-09-25 12:15:32
我在dev c++中建立了一个控制台c工程,只写了两个文件如下所示,没有任何头文件,也没有用extern声明ppp函数,但是却能执行,请问高手这是为什么?
main.c
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
ppp();
system("PAUSE");
return 0;
}
1.c
void ppp()
{
printf("%d\n",1);
}
...全文
1522
32
打赏
收藏
没有头文件,为什么能运行?
我在dev c++中建立了一个控制台c工程,只写了两个文件如下所示,没有任何头文件,也没有用extern声明ppp函数,但是却能执行,请问高手这是为什么? main.c #include #include int main(int argc, char *argv[]) { ppp(); system("PAUSE"); return 0; } 1.c void ppp() { printf("%d\n",1); }
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
32 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Nash1983
2006-09-27
打赏
举报
回复
编译器不严格,如果改成.cpp就通不过了
waterczh
2006-09-26
打赏
举报
回复
MARK
lann64
2006-09-26
打赏
举报
回复
唉,k&R标准、c89标准还是如此深入人心呀。什么函数不用声明返回类型,函数前向声明不用声明调用参数的,这些在c99标准已经修改了的东东,现在还是有很多人抱着不放。而且还有人认为c本来就是这样,那些要求是从c++里的。是的,c++要求,可c99也已经改成要求了。用c的朋友们,还是改改自己的习惯,向c99靠齐吧。
sharkoasis
2006-09-26
打赏
举报
回复
在工程中应该是可以编译通过的!
mLee79
2006-09-26
打赏
举报
回复
C 本来就不需要声名函数, 啥编译器编译不过, 俺倒没遇到过 ....
当main()需要ppp()的时候, 编译器会在main.o和l.o里自动寻找ppp()的实现
----------------------------------------------------------------------
显然不对, 编译 main.c 的时候跟 l.c 一点关系都没有, 编译器会自动声名 ppp 的原型为 int ppp() , 并给个警告啥的 ...
123ppmove
2006-09-26
打赏
举报
回复
Makefile
不是linux下用的?
VC识别不了吧?
你用turborC试试;
lann64
2006-09-26
打赏
举报
回复
6.11.6 Function declarators
1 The use of function declarators with empty parentheses (not prototype-format parameter
type declarators) is an obsolescent feature.
mLee79
2006-09-26
打赏
举报
回复
很抱歉的是 标准里明确支持 int foo() 作为 int foo( int , int ) 的声明 , 并且我认为在以后的标准中, 这一点也不会有任何的修改 ....
lann64
2006-09-26
打赏
举报
回复
mLee79()
C99 标准什么时候对此进行了修改, C99 只是不在支持 func() == int func() 而已, 绝对没有禁止调用未声明的函数, C 也显然没有向 cpp 靠拢的迹象 ...
============================
我没说“禁止调用未声明的函数”,我说的是“函数前向声明不用声明调用参数”被c99完全放弃了。按照k&R标准 int foo(int i,int j)这样的函数前向声明是可以为 int foo()这样的,这种声明在c99中被认为是出错。我哪里说错了?
至于c有没有向c++靠拢,个人理解去吧。我没说过,你要这样理解,随你了。
不知道是我说的不清楚,还是你的理解力有问题。
lhbgyl
2006-09-26
打赏
举报
回复
鉴于讨论未结束,暂不结贴,请大家继续讨论,多学知识,先加50分,如果能讨论出有启发的东西,再加分
mLee79
2006-09-26
打赏
举报
回复
lann64(昆仑大鹏) :
C99 标准什么时候对此进行了修改, C99 只是不在支持 func() == int func() 而已, 绝对没有禁止调用未声明的函数, C 也显然没有向 cpp 靠拢的迹象 ...
P499 , Common warnings 下明确的写着 :
— A function is called but no prototype has been supplied (6.5.2.2).
标准仅仅要求对未声明的函数调用给出一个警告而已 .....
lhbgyl
2006-09-26
打赏
举报
回复
谢谢各位的解答,我已经清楚了
crazy_lazy_pig
2006-09-26
打赏
举报
回复
另外, 楼主: 上面有几个人批评了你的写代码的规范问题,不知道你是否有注意.
就是说在main()函数之前应该加入一个提前声明:
void ppp();
注意,C语言是严格类型语言,在使用任何东西之前必须先声明,这才是好的代码规范.
(而是不是有头文件并不重要,其实头文件的作用就是让你少写几个字或者使一些代码方便于重复利用, #include完全等价于你把头文件里的内容拷贝到现有文件中去).
crazy_lazy_pig
2006-09-26
打赏
举报
回复
To: mLee79()
多谢你的指导,我是自学者,而且不愿意看书,所以很多东西都是凭个人揣测的,关于提前声明和编译警告的事我确实是没有注意. 不过我说的"自动寻找ppp()的实现"是指连接过程,而不是编译过程.
to: 楼主
看情况, 楼主是不理解编译和连接,英文里编译用compile,连接用link, 这是两个完全不同概念,而中的教材往往把这两个过程合称"编译",这是不对的.
楼主问的"怎么把几个C程序组织起来", 其实就是连接问题. 对于写好的C源代码, 我们首先要编译,即生成目标代码(一种中间代码,需进一步处理而成可执行的机器代码); 然后把目标代码文件(可能是好几个)中的函数连接成有实际功能的可执行代码. 具体做法如下(以gcc编译器为例):
gcc -c main.c
gcc -c l.c
gcc -o test.exe main.o l.o
上面给出的是命令行下要敲的三条命令,其中main.o和l.o是编译过程(即前两个命令gcc -c ...)生成的中间代码文件, 最后的test.exe是最终连接生成的可执行文件,在命令行下继续敲test.exe就可以看到结果了.
make文件里其实就是存贮了上面的三行命令,它是通过另外一个叫make程序的程序调用,解释执行这三条命令,其实跟在命令行下直接敲这三行命令是等价的;工程文件其实实现的就是make文件的功能,也就等价于命令行下敲这三个命令. 因此可以的结论: 工程文件跟make文件其实跟c语言没有什么大的联系,这只是为了使我们使用的方便而出现的第三方管理工具(试想,如果我们有几十甚至上百个源文件,那么在从命令行下敲那些命令是不是太累了), 我们可以用它来简化操作,但是也完全可以不用.
lhbgyl
2006-09-26
打赏
举报
回复
怎么大家的解释都不一样啊,另外大家都没有回答我的问题:如果没有工程文件和makefile文件,怎么把几个c程序组织起来,还有c标准中是否提到了一定要工程文件或者makefile文件?
Arthur_
2006-09-25
打赏
举报
回复
不建立工程要有makefile文件,看一下吧
lhbgyl
2006-09-25
打赏
举报
回复
我在DEV中不打开工程文件,直接打开main.c和1.c文件,用extern 和头文件方式都试过了,都不能编译,请问工程文件是c语言中必需的吗?c的书籍里怎么没有说工程文件是必需的呢?
mLee79
2006-09-25
打赏
举报
回复
C 遇到未申明的函数时, 自动认为是 int func();
gcc 的实现符合标准, 没遇到过不能过的编译器, 一般都给个警告, 不是好习惯 ...
Arthur_
2006-09-25
打赏
举报
回复
dev c在你建立工程的時候為你做了好多事情
lann64
2006-09-25
打赏
举报
回复
应该可以的,编译器会给出警告而已。但连接器会找到连接点,最终能够生成可执行程序。
gcc就是这样实现的。虽然不严格符合标准。
加载更多回复(12)
stdint.h
头文件
很多项目经常使用的两个
头文件
inttypes.h stdint.h,否则会报错。网上很多资料,但基本上不可用。这两个文件,我在自己的项目中
运行
良好。
最全的C和C++语言笔试面试题汇总
最全的C和C++语言笔试面试题汇总,我大四时候找工作时候他帮上了很多忙,里面的题目经常考到。希望对大家有帮助。
全局变量可不可以定义在可被多个.C文件包含的
头文件
中?为什么?
全局变量可不可以定义在可被多个.C文件包含的
头文件
中?为什么? 答:可以,在不同的C文件中以static形式来声明同名全局变量。 可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错. -------1. 请高手用VC举个例子. 2. 如何在不同的C文件中以static形式来
创建静态库/动态库一定要有
头文件
吗?为什么?
不一定需要。创建一个库一般处于一下两种目的: 1、把一些相关的代码,打包成一个库,发布给其它的人用。 这中情况是最常见的情况,如写 C 语言用到 libgcc。在这种情况下,你除了提供库文件: 静态库[ windows 下 .lib,linux .a];动态库:[Windows 下 .dll,Linux 下 .so] 之外, 必须提供
头文件
。
头文件
是你这个库里面提供了那些接口可以供外界使用。 如果
没有
头文件
,其他人无法使用,因为不知道函数方法的原型! 2、在为某些软件项目写插件,而这些项目软件是公司内部的;
C语言的
头文件
是必须的吗?
原文地址:http://blog.chinaunix.net/uid-24774106-id-3291005.html 转给对C语言使用
头文件
困惑的同僚。 N年前学习C语言开始,就被老师教导,要记得包含
头文件
。自己也养成了二话不说就#include的习惯。从来
没有
静下信来想想,C语言必需要有
头文件
吗?
头文件
到底起到什么的作用。 最近一段时间做了一些静态
C语言
70,014
社区成员
243,263
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章