c - 在c中包含自定义头文件

标签 c header-files

我只是想用 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/

相关文章:

c - 如何在看门狗重启操作系统之前检测 Linux (Debian) 看门狗守护进程中出现的问题

c - 后台进程c

c - 头文件中的枚举声明

c - 使用 GCC 的另一个目录中的静态库和 header

c - 在 Visual Studio 2010 中传递命令行参数?

c - 关于C语言函数中指针的问题

c - 有效地对结构数组进行排序

c++ - 我可以在 C++ 的头文件中放置一个内联函数吗?

c - 预处理器#ifndef

在C中使用自己的头文件调用函数