在#Include指令中使用C文件时C程序出错(多重定义错误)

时间:2015-08-01 08:04:27

标签: c linker-errors

场景:

在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;文件本身,因为它给出了上述(意外)错误?

2 个答案:

答案 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:首先在这里定义