场景:
在Netbeans IDE中创建的C应用程序,包含以下两个文件:
some_function.c
#include <stdio.h>
int function_1(int a, int b){
printf("Entered Value is = %d & %d\n",a,b);
return 0;
}
newmain.c
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
//function_2(); //Error //function name not allowed
function_1();
function_1(1);
function_1(1,2);
return (EXIT_SUCCESS);
}
当在C程序中学习头文件的需要时,我尝试了上述应用程序(原样)。它被编译并给出如下输出
输入值= 4200800&amp; 102个
输入值= 1&amp; 102个
输入值= 1&amp; 2
问题1:(我意识到,在开始阶段,理解链接器程序的过程很难,因此我问这个问题。)我的假设是正确的,当链接时,&# 34;链接器将检查函数名称而不是参数&#34;在没有使用头文件的情况下?
关于标头文件的使用情况,我遇到了这个link,并说它是,我们可以使用 #include 包含C文件本身。所以,我在 newmain.c
文件中使用了以下行#include "some_function.c"
正如预期的那样,它显示了以下错误
错误:函数&#39; function_1()&#39;
的参数太少 错误:函数的参数太少&#39; function_1(1)&#39;
而且,我收到了以下(意外)错误:
some_function.c:8:`function_1&#39;的多重定义 some_function.c:8:首先在这里定义
问题2:在包含&#39; c&#39;文件本身,因为它给出了上述(意外)错误?
答案 0 :(得分:5)
你可能正在使用C的C99前方言,它有“隐式函数声明”。这意味着没有声明的函数被认为具有这种签名:
int function_1();
即。返回int
并接受任意类型的任意数量的参数。传递与函数定义不兼容的参数列表时,在运行时调用未定义的行为。
关于多重定义错误,请考虑一下。包含some_function.c
的每个翻译单元都有自己的功能定义。就好像您已经在每个其他.c
文件中编写了该定义。 C不允许在程序/库中使用多个定义。
答案 1 :(得分:1)
我(提问者)发布了这个答案,以便快速了解一些C编程的初学者。这个答案来自@juanchopanza&amp;的答案。 @Sam Protsenko ,在这篇文章中。
问题1: Implicit function declarations in C
问题2: 使用以下行时
#include "some_function.c"
在预处理器活动之后,结果应用程序将如下改变 some_function.c
#include <stdio.h>
int function_1(int a, int b){
printf("Entered Value is = %d & %d\n",a,b);
return 0;
}
newmain.c
#include <stdio.h>
#include <stdlib.h>
/*"#include "some_function.c"" replace begin by preprocessor*/
#include <stdio.h>
int function_1(int a, int b){
printf("Entered Value is = %d & %d\n",a,b);
return 0;
}
/*"#include "some_function.c"" replace end by preprocessor*/
int main(int argc, char** argv) {
//function_2(); //Error //function name not allowed
//function_1(); //Error
//function_1(1); //Error
function_1(1,2);
return (EXIT_SUCCESS);
}
注意:在上面两个文件中,函数function_1有两个位置
所以现在下面的错误是有意义的
some_function.c:8:`function_1&#39;的多重定义 some_function.c:8:首先在这里定义