1

我只是想在 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 中未定义的符号 diffcheck(int)

模块 LETS.cpp 中未定义的符号 diffadd(int near*, int)

有趣的是,如果我在 LETS.cpp 中包含 inc2.cpp,它可以工作。

如果我创建一个单独的头文件 HEAD.h 并在此处定义所有函数,则它可以工作。

请解释这里发生了什么!

4

2 回答 2

3

您应该在 Internet 上查找有关程序链接的一些教程。

当您编译单个.c/.cpp文件时,编译器通常会为您执行链接工作,并且您在其输出中拥有完整的可执行文件。但是当你有多个源文件时,事情就变得复杂了:每个源文件(不是.h头文件!)都被编译成一个中间文件,目标文件,其中包含一个符号列表(函数/变量名称/内存中的地址- 所有驻留在内存中且对外部文件可见的文件提供的文件以及文件所需的单独符号列表。这个阶段称为compilation自身。然后你有一堆目标文件,可以与一个特殊的程序链接器组合成你想要的可执行文件——这被称为linking一个程序。链接器获取所有文件的必需/提供符号列表,并查找是否可以在所有目标文件的给定符号集中找到所有必需符号,然后提供的函数链接到需要它们的位置。

头文件只是包含在源文件(.c/.cpp)中的文本存根,它们不是编译的主题(有一些例外)。

因此:将您编译inc2.cpp成一个目标文件,编译lets.cpp成另一个目标文件,然后让链接器将它们组合成可执行文件。

于 2012-10-08T06:05:01.963 回答
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) { 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();
   }

它也可能对你有用。

您也可以编写头文件,例如名称#include“inc2.pp”,这也可以。

于 2012-10-08T06:37:48.307 回答