我只是想用 C 实现我自己的头文件。 首先,我有一个文件 INC2.h
void diffadd(int b[], int n);
int diffcheck(int m);
然后我制作一个文件INC2.cpp
void diffadd(int b[], int n)
{
int i=0;
for (i=0; i < n; i++)
{
b[i]=b[i]+1;
printf("\n%d",b[i])
}
}
int diffcheck(int m)
{
return (m*5);
}
然后在主文件LETS.cpp
#include"inc2.h"
void main()
{
clrscr();
int a[5]={1,2,3,4,5};
diffadd(a,5);
int t=diffcheck(5);
printf("t=%d",t);
getch();
}
现在我编译inc2.cpp。很好!
然后我编译lets.cpp。
我收到以下错误:
模块 LETS.cpp 中的 undefined symbol diffcheck(int)
模块 LETS.cpp 中的 undefined symbol diffadd(int near*, int)
有趣的是,如果我在 LETS.cpp 中包含 inc2.cpp,它就可以工作。
如果我创建一个单独的头文件 HEAD.h 并在此处定义所有函数,它就可以工作。
请解释这里发生了什么!
最佳答案
您应该在 Internet 上查找一些关于程序链接的教程。
当您编译单个.c/.cpp
文件时,编译器通常会为您做链接工作,并且您在其输出中有一个完整的可执行文件。但是当你有多个源文件时,事情就变得复杂了:每个源文件(不是 .h
,头文件!)都被编译成一个中间文件,目标文件 ,其中包含文件提供的符号列表(内存中的函数/变量名称/地址 - 所有驻留在内存中且对外部文件可见的内容)以及文件所需的单独符号列表.这个阶段本身称为编译
。然后你有一堆目标文件,可以用一个特殊的程序 linker 组合成你想要的可执行文件 - 这称为 linking
一个程序。链接器获取所有文件的必需/提供的符号列表,并查找是否可以在所有目标文件中给定的一组提供的符号中找到所有必需的符号,然后链接提供的函数到它们所在的位置'需要。
头文件只是按字面意义包含在源文件 (.c/.cpp) 中的文本 stub ,它们不是编译对象(有一些异常(exception))。
因此:将您的 inc2.cpp
编译成目标文件,将 lets.cpp
编译成另一个目标文件,然后让链接器将它们组合成可执行文件。
关于c - 在c中包含自定义头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12775918/