头文件的包含问题

时间:2021-03-17 16:45:23
请问:
  我在一个头文件中包含了另外一个头文件,如果我把这个被包含的头文件移动到实现文件中,为什么就编译不过呢?
  例如:
  
  // main.h
  #include "test.h"
  ...
  //end

  // main.c  
  #include "main.h"
  ...
  //end

现在改为:
  //main.h
  ...
  // end

  // main.c
  #include "test.h"
  #include "main.h"
  ....
  //end

改后就不能编译通过呢,
其中main.h使用test.h中声明的用户自定义类型。

15 个解决方案

#1


#pragma  once   ???

#2


具体出错原因!!

#3


在test中加:
#ifndef _test_h_
#define _test_h_




#endif

#4


...     其实对文件编译也没什么东西!
 只要你理解这东西是什么就会了~

比如
mail.c 文件:
#include "stdio.h"
int main(void)
{
    return 0;
}

编译的时候基本就是把#include "stdio.h"行换成stdio.h文件的内容!

呵呵

#5


增加一个 限制一次包含 指令 ...

#pragma  once
或者
#ifndef _test_h_
#define _test_h_
...
#endif

#6


加上
#pragma once

#7


其中main.h使用test.h中声明的用户自定义类型。

这个时候需要在main.h中包含test.h
如果你main的头文件中没有test中声明的用户自定义类型的话,不需要

#8


同意 peterID

问一下 预处理命令   #pragma once  什么意思啊!具体点

#9


// main.c
  #include "main.h"
  #include "test.h"
  ....
  //end
这样试试

#10


同意peterID(peter)
正解

#11


看上去不是重复包含头文件的问题。

你的错误提示是什么?
是不是有别的文件包含了main.h,但没有包含test.h?

#12


请问 peterID:
    你是这样说的:
        这个时候需要在main.h中包含test.h
        如果你main的头文件中没有test中声明的用户自定义类型的话,不需要
   
   我在main.h中使用了test中声明的用户自定义类型。我就是觉得奇怪,我为什么不可以将放在main.h中的test.h去掉。而在实现文件中在包含main.h文件前先包含test.h呢。
我个人理解应该是一样的,但编译通不过。一个工程,它的具体编译过程是具体是怎样编译的。
 谢谢!
                                   
    

#13


谢谢:yzx1983(捕风捉影) 
    确实是这个问题,我工程里有很多文件都包含了main.h,我只注意到其中一个实现文件。你提醒了我,请问怎么操作给分啊。

#14


点击这页上面的“管理”给分

#15


再请教:
   #include"test1.h"
   #include"test2.h"
 肯定是test1.h先编译吗?
我使用的是BC31环境,我想在头文件代码中加入#pragma message("test1.h")这样的预编译命令来判断谁先编译,但不起作用,好像#pragma message BC31 不支持,请问 BC31下 用什么样的命令能实现这个结果

#1


#pragma  once   ???

#2


具体出错原因!!

#3


在test中加:
#ifndef _test_h_
#define _test_h_




#endif

#4


...     其实对文件编译也没什么东西!
 只要你理解这东西是什么就会了~

比如
mail.c 文件:
#include "stdio.h"
int main(void)
{
    return 0;
}

编译的时候基本就是把#include "stdio.h"行换成stdio.h文件的内容!

呵呵

#5


增加一个 限制一次包含 指令 ...

#pragma  once
或者
#ifndef _test_h_
#define _test_h_
...
#endif

#6


加上
#pragma once

#7


其中main.h使用test.h中声明的用户自定义类型。

这个时候需要在main.h中包含test.h
如果你main的头文件中没有test中声明的用户自定义类型的话,不需要

#8


同意 peterID

问一下 预处理命令   #pragma once  什么意思啊!具体点

#9


// main.c
  #include "main.h"
  #include "test.h"
  ....
  //end
这样试试

#10


同意peterID(peter)
正解

#11


看上去不是重复包含头文件的问题。

你的错误提示是什么?
是不是有别的文件包含了main.h,但没有包含test.h?

#12


请问 peterID:
    你是这样说的:
        这个时候需要在main.h中包含test.h
        如果你main的头文件中没有test中声明的用户自定义类型的话,不需要
   
   我在main.h中使用了test中声明的用户自定义类型。我就是觉得奇怪,我为什么不可以将放在main.h中的test.h去掉。而在实现文件中在包含main.h文件前先包含test.h呢。
我个人理解应该是一样的,但编译通不过。一个工程,它的具体编译过程是具体是怎样编译的。
 谢谢!
                                   
    

#13


谢谢:yzx1983(捕风捉影) 
    确实是这个问题,我工程里有很多文件都包含了main.h,我只注意到其中一个实现文件。你提醒了我,请问怎么操作给分啊。

#14


点击这页上面的“管理”给分

#15


再请教:
   #include"test1.h"
   #include"test2.h"
 肯定是test1.h先编译吗?
我使用的是BC31环境,我想在头文件代码中加入#pragma message("test1.h")这样的预编译命令来判断谁先编译,但不起作用,好像#pragma message BC31 不支持,请问 BC31下 用什么样的命令能实现这个结果