突然想到递归包含怎么样预处理?

苏客达 2014-05-30 06:29:31
如题,有两个文件

a.h
========================================
#ifndef _A_H_
#define _A_H_

#include "b.h"
struct A
{
struct B *pb;
}

#endif

b.h
==========================================
#ifndef _B_H_
#define _B_H_

#include "a.h"
struct B
{
struct A *pa;
}

#endif

main.c
======================================

#include "a.h"
A a;
.....

这种情况预编译的过程是怎么样的?
...全文
146 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-06-03
  • 打赏
  • 举报
回复
编译选项加/EP /P,重新编译,查看宏展开后对应的.i文件。gcc加-E 理解讨论之前请先学会如何观察
Saleayas 2014-06-03
  • 打赏
  • 举报
回复
禁止相互 #include 。编译不通过的。 使用签名就可以了。
lm_whales 2014-06-03
  • 打赏
  • 举报
回复
引用 1 楼 wu4357815 的回复:
这没什么实际价值。递归调用倒是有点用,你只需两个都前向声明就行了
++
lm_whales 2014-06-03
  • 打赏
  • 举报
回复
假设编译器,可以正确处理,编译过程如下:


编译 main.cpp
//main.cpp
。。。。

#include "a.h" //此时处理对a.h的包含
//===> 嵌入a.h
#ifndef _A_H_ //
#define _A_H_ //  _A_H_  defined.

#include "b.h"//  此时处理对b.h的包含
//==>嵌入b.h
#ifndef _B_H_
#define _B_H_ //  _B_H_  defined.

#include "a.h"//==> 第二次 嵌入a.h

#ifndef _A_H_  //  1)_A_H_  defined. 所以除了配对的#endif ,后面的预编译语句,不执行;代码也不会编译了,所以没有递归。
//#define _A_H_
//........
#endif         // 2) 只有 1)2) 这两个预编译语句会执行,结果是跳过中间所有代码,不编译。


struct B
{
    struct A *pa;//没有前置声明,struct A不能识别,编译出错,所以struct B不能识别
}// ;这里应该有分号,不然这里或者后面,会报缺少分号错误。

#endif

struct A
{
    struct B *pb;   //有定义,本来是不会出错的,不过struct B不能识别,所以这里应该还是会编译出错
}// ;这里应该有分号,不然这里或者后面,会报缺少分号错误。

#endif
PS: 交叉引用的类型的头文件里面,不能缺少类型前置声明。
wu4357815 2014-05-30
  • 打赏
  • 举报
回复
这没什么实际价值。递归调用倒是有点用,你只需两个都前向声明就行了

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧