在#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
场景:
在 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 编程初学者快速理解。这个答案 的灵感来自
问题 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