我只是想在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。 FINE!
然后我编译lets.cpp。
我收到以下错误:
模块LETS.cpp中未定义的符号diffcheck(int)
模块LETS.cpp中的未定义符号diffadd(int near *,int)
有趣的是,如果我在LETS.cpp中包含inc2.cpp,那就是IT WORKS。
如果我创建一个单独的头文件HEAD.h并在此处定义所有函数,那么IT WORKS。
请解释这里发生的事情!
答案 0 :(得分:3)
您应该在互联网上查找有关程序链接的一些教程。
当您编译单个.c/.cpp
文件时,编译器通常会为您执行链接工作,并且您的输出上有完整的可执行文件。但是当你有多个源文件时,事情会变得复杂:每个源文件(不是.h
,header!)都被编译成一个中间文件,目标文件,其中包含一个内容提供的符号(内存中的函数/变量名称/地址 - 所有驻留在内存中并且对外部文件可见)的列表以及文件所需的单独符号列表。此阶段称为compilation
。然后,您有一堆目标文件可以与特殊程序 linker 组合到您想要的可执行文件中 - 这称为linking
程序。链接器获取所有文件的必需/提供符号列表,并查找是否可以在所有目标文件中的给定提供符号集中找到所有必需符号,然后 links 将函数提供给它们所在的位置'需要。
头文件只是文本存根,直接包含在源文件(.c / .cpp)中,它们不是编译主题(有一些例外)。
因此:将inc2.cpp
编译成目标文件,将lets.cpp
编译成另一个目标文件,然后让链接器将它们组合成可执行文件。
答案 1 :(得分:0)
当我第一次定义自己的头文件时,我也遇到了同样的错误。然后我定义了一个带有函数定义的头文件,这对我有用。
你只需要这样做。定义头文件,如
//inc2.h
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) { 返回(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.pp” 那也行。