没有头文件,为什么能运行?

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 打赏 收藏 转发到动态 举报
写回复
用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)

70,014

社区成员

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

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