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

Error in C program when using a C file in #Include directive (Multiple definition error)

场景:

在 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程序中头文件的需要时,我尝试了上面的应用程序(原样)。它被编译并给出如下输出

Entered Value is = 4200800 & 102
Entered Value is = 1 & 102
Entered Value is = 1 & 2

问题1:(我意识到,在开始阶段,理解链接器程序的过程是困难的,所以我问这个问题。)我的假设是否正确,即链接时,"the linker will check for the function name and not the arguments" 在未使用头文件的情况下?

关于头文件的使用,我遇到了这个 link,它说我们可以使用 #include 包含 C 文件本身。所以,我在文件 newmain.c

中使用了以下行
#include "some_function.c"

正如预期的那样,它显示了以下错误

error: too few arguments to function 'function_1()'
error: too few arguments to function 'function_1(1)'

此外,我还遇到了以下(意外)错误:

some_function.c:8: multiple definition of `function_1'
some_function.c:8: first defined here

问题 2: 我在包含 'c' 文件本身时犯了什么错误,因为它给出了上述(意外)错误?

您可能使用的是 C 的 C 99 之前的方言,其中有 "implicit function declarations"。这意味着没有声明的函数被认为具有这种签名:

int function_1();

即返回 int 并接受任意数量的任意类型的参数。当您传递与您的函数定义不兼容的参数列表时,您会在运行时调用 未定义的行为

关于多重定义错误,想想看。您包含的每个翻译单元 some_function.c 都会有自己的函数定义。就好像您在每个其他 .c 文件中都写了该定义一样。 C 不允许在 program/library.

中有多个定义

我(提问者)post 这个答案是为了让一些 C 编程初学者快速理解。这个答案 的灵​​感来自 和@Sam Protsenko 的答案 post.

问题 1:Implicit function declarations in C

问题二: 使用以下行时

#include "some_function.c"

经过预处理器activity
后,结果应用会发生如下变化 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: multiple definition of `function_1'
some_function.c:8: first defined here