C 函数调用、头文件声明、编译链接相关问题

时间:2022-07-06 09:44:41
最近看了C语言的东西,用VS2013写了个简单的程序运行了一下,有些疑问
//源文件b.c
void fun(int a, int b)
{
printf("%d", a + b);
}

//test.c
main()
{
int a, b;
scanf("%d%d", &a, &b);
fun(a, b);
system("pause");
}

程序能运行起来,为什么test.c中不用声明fun()函数,或者做个头文件b.h再#include一下,程序就能运行呢?
对c语言的编译和链接方面不太懂,望大神指导一下,谢谢啦!

9 个解决方案

#1


你把fun放下面试试
为啥非得放main上面

#2


引用 1 楼 qq_38204686 的回复:
你把fun放下面试试
为啥非得放main上面

楼主是两个源文件:b.c放func函数定义,test.c是main的定义和调用func函数。不是在一个源文件里。
楼主的这个问题,func函数本身就是定义和声明。在编译的时候应该是编译b.c在test.c前,就类似func在main函数前定义。
个人见解,欢迎指正。

#3


楼上很有道理 可能就是编译器的事
我试了一下报错 并不能运行
建议楼主贴出完整代码 
大概你的编译器比较高级? C 函数调用、头文件声明、编译链接相关问题

#4


如果你之前没有进行fun函数的宏定义应该是运行不成功的,编译阶段会在内核中将每个函数编译成一个号码,在Linux下用nm命令可看到每个函数在编译时的号码。
nm操作    nm+可执行文件名(如 nm   a.out)

#5


引用 4 楼 shetougong 的回复:
如果你之前没有进行fun函数的宏定义应该是运行不成功的,编译阶段会在内核中将每个函数编译成一个号码,在Linux下用nm命令可看到每个函数在编译时的号码。
nm操作    nm+可执行文件名(如 nm   a.out)


那我还是截个图把,看着方便些
C 函数调用、头文件声明、编译链接相关问题
C 函数调用、头文件声明、编译链接相关问题

用的VS2013,就建了这两个.c文件

#6


引用 2 楼 cfjtaishan 的回复:
Quote: 引用 1 楼 qq_38204686 的回复:

你把fun放下面试试
为啥非得放main上面

楼主是两个源文件:b.c放func函数定义,test.c是main的定义和调用func函数。不是在一个源文件里。
楼主的这个问题,func函数本身就是定义和声明。在编译的时候应该是编译b.c在test.c前,就类似func在main函数前定义。
个人见解,欢迎指正。


应该是编译的问题,你运行这个程序了没有,什么结果?

#7


引用 6 楼 qq_31849783 的回复:
Quote: 引用 2 楼 cfjtaishan 的回复:

Quote: 引用 1 楼 qq_38204686 的回复:

你把fun放下面试试
为啥非得放main上面

楼主是两个源文件:b.c放func函数定义,test.c是main的定义和调用func函数。不是在一个源文件里。
楼主的这个问题,func函数本身就是定义和声明。在编译的时候应该是编译b.c在test.c前,就类似func在main函数前定义。
个人见解,欢迎指正。


应该是编译的问题,你运行这个程序了没有,什么结果?

这个程序不复杂,输入两个值,得到是这两个值的和。

#8


引用 7 楼 cfjtaishan 的回复:
Quote: 引用 6 楼 qq_31849783 的回复:

Quote: 引用 2 楼 cfjtaishan 的回复:

Quote: 引用 1 楼 qq_38204686 的回复:

你把fun放下面试试
为啥非得放main上面

楼主是两个源文件:b.c放func函数定义,test.c是main的定义和调用func函数。不是在一个源文件里。
楼主的这个问题,func函数本身就是定义和声明。在编译的时候应该是编译b.c在test.c前,就类似func在main函数前定义。
个人见解,欢迎指正。


应该是编译的问题,你运行这个程序了没有,什么结果?

这个程序不复杂,输入两个值,得到是这两个值的和。


我的意思是你按照我那样做,程序是不是也能正常运行,我想看看你们的都是什么情况

#9


不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

#1


你把fun放下面试试
为啥非得放main上面

#2


引用 1 楼 qq_38204686 的回复:
你把fun放下面试试
为啥非得放main上面

楼主是两个源文件:b.c放func函数定义,test.c是main的定义和调用func函数。不是在一个源文件里。
楼主的这个问题,func函数本身就是定义和声明。在编译的时候应该是编译b.c在test.c前,就类似func在main函数前定义。
个人见解,欢迎指正。

#3


楼上很有道理 可能就是编译器的事
我试了一下报错 并不能运行
建议楼主贴出完整代码 
大概你的编译器比较高级? C 函数调用、头文件声明、编译链接相关问题

#4


如果你之前没有进行fun函数的宏定义应该是运行不成功的,编译阶段会在内核中将每个函数编译成一个号码,在Linux下用nm命令可看到每个函数在编译时的号码。
nm操作    nm+可执行文件名(如 nm   a.out)

#5


引用 4 楼 shetougong 的回复:
如果你之前没有进行fun函数的宏定义应该是运行不成功的,编译阶段会在内核中将每个函数编译成一个号码,在Linux下用nm命令可看到每个函数在编译时的号码。
nm操作    nm+可执行文件名(如 nm   a.out)


那我还是截个图把,看着方便些
C 函数调用、头文件声明、编译链接相关问题
C 函数调用、头文件声明、编译链接相关问题

用的VS2013,就建了这两个.c文件

#6


引用 2 楼 cfjtaishan 的回复:
Quote: 引用 1 楼 qq_38204686 的回复:

你把fun放下面试试
为啥非得放main上面

楼主是两个源文件:b.c放func函数定义,test.c是main的定义和调用func函数。不是在一个源文件里。
楼主的这个问题,func函数本身就是定义和声明。在编译的时候应该是编译b.c在test.c前,就类似func在main函数前定义。
个人见解,欢迎指正。


应该是编译的问题,你运行这个程序了没有,什么结果?

#7


引用 6 楼 qq_31849783 的回复:
Quote: 引用 2 楼 cfjtaishan 的回复:

Quote: 引用 1 楼 qq_38204686 的回复:

你把fun放下面试试
为啥非得放main上面

楼主是两个源文件:b.c放func函数定义,test.c是main的定义和调用func函数。不是在一个源文件里。
楼主的这个问题,func函数本身就是定义和声明。在编译的时候应该是编译b.c在test.c前,就类似func在main函数前定义。
个人见解,欢迎指正。


应该是编译的问题,你运行这个程序了没有,什么结果?

这个程序不复杂,输入两个值,得到是这两个值的和。

#8


引用 7 楼 cfjtaishan 的回复:
Quote: 引用 6 楼 qq_31849783 的回复:

Quote: 引用 2 楼 cfjtaishan 的回复:

Quote: 引用 1 楼 qq_38204686 的回复:

你把fun放下面试试
为啥非得放main上面

楼主是两个源文件:b.c放func函数定义,test.c是main的定义和调用func函数。不是在一个源文件里。
楼主的这个问题,func函数本身就是定义和声明。在编译的时候应该是编译b.c在test.c前,就类似func在main函数前定义。
个人见解,欢迎指正。


应该是编译的问题,你运行这个程序了没有,什么结果?

这个程序不复杂,输入两个值,得到是这两个值的和。


我的意思是你按照我那样做,程序是不是也能正常运行,我想看看你们的都是什么情况

#9


不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!