#include "SomeFile.h"是否等价于把SomeFile.h插入到#include处

飞驰的青蛙 2007-01-16 02:17:49
我不太理解C++编译器怎样处理#include "SomeFile.h"
在ASP中 #include "SomeFile"会原封不动的把SomeFile中的文本插入到#include处。

在C++中假如有这么几个文件:
a.h
a.cpp
b.h
b.cpp
main.cpp
假如b.h包含a.h
main.cpp包含a.h、 b.h则会出现编译错误说:对象重复定义。如此看上去好像在#include 文件时就像是原封不动的把文件插入到#include处。

我试着这么做过,把main.cpp中#include "a.h" #include "b.h"都删去。先不管b.h和b.cpp,把a.h的所有内容复制到main.cpp中,这样在a.h和main.cpp中都有对class a的定义,main.cpp中声明class a的对象,
class a 中有个内联函数 a::f(){_ss=3;},调试运行时发现,main.cpp中调用的是a.h中的函数,对它本身内的定义视而不见。

#include到底做了什么?
...全文
333 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
OOPhaisky 2007-01-17
  • 打赏
  • 举报
回复
我不太理解C++编译器怎样处理#include "SomeFile.h"
在ASP中 #include "SomeFile"会原封不动的把SomeFile中的文本插入到#include处。
------------------------------------------------------------------------------------
在C++中,也是这样的“拷贝”过程。
fantacyland 2007-01-17
  • 打赏
  • 举报
回复
文本拷贝
jixingzhong 2007-01-17
  • 打赏
  • 举报
回复
#include到底做了什么?

它将 包含的文件在 包含语句 的位置进行展开,
也就是所有的 include指定文件中定义的内容,
都将在这个 include 位置出现
(相当于把 h 文件的内容都拷贝到 include 语句的位置来)

所以,
重复定义是很显然的,
为了防止这个问题,
通常使用的有两种办法:
1 #pragma once 预编译指令, 该指令指示仅被包含一次
2 在h文件开头部分使用:
#ifndef XXX_H
#define XXX_H
...//这里是头文件的内容
#endif
通过 该预编译选择指令防止头文件被重复包含
v2002750 2007-01-17
  • 打赏
  • 举报
回复
基本上是

可能会有包含保护的情况,老保证一个文件不被多次包含。实际上这是通过条件编译做到的,本质上还是把文件全部COPY过来。
caocheng8230 2007-01-16
  • 打赏
  • 举报
回复
是的,这就是头文件的作用
060 2007-01-16
  • 打赏
  • 举报
回复
有的编译器能够显示能够显示预处理之后的代码。
好像gcc由这个功能。
VC可能也有这个功能。
pottichu 2007-01-16
  • 打赏
  • 举报
回复
main.cpp包含a.h、 b.h则会出现编译错误说:对象重复定义。
如此看上去好像在#include 文件时就像是原封不动的把文件插入到#include处。
----------------------------------------------
你在 a.h, b.h 文件的最开始加上
#pragma once
就好了, 因为你多次包含一个头文件会导致 "对象重复定义"
而#pragma once 告诉你, 只包含一次就好了.

确实是 "原封不动的把文件插入到#include"

huangyangman 2007-01-16
  • 打赏
  • 举报
回复
假如b.h包含a.h
main.cpp包含a.h、 b.h则会出现编译错误说:对象重复定义
---------------------
???
taodm 2007-01-16
  • 打赏
  • 举报
回复
#include "SomeFile"会原封不动的把SomeFile中的文本插入到#include处
mLee79 2007-01-16
  • 打赏
  • 举报
回复
是的, 当时就是这样 ...

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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