#include "SomeFile.h"是否等价于把SomeFile.h插入到#include处
我不太理解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到底做了什么?
[解决办法]
是的, 当时就是这样 ...
[解决办法]
#include "SomeFile "会原封不动的把SomeFile中的文本插入到#include处
[解决办法]
假如b.h包含a.h
main.cpp包含a.h、 b.h则会出现编译错误说:对象重复定义
---------------------
???
[解决办法]
main.cpp包含a.h、 b.h则会出现编译错误说:对象重复定义。
如此看上去好像在#include 文件时就像是原封不动的把文件插入到#include处。
----------------------------------------------
你在 a.h, b.h 文件的最开始加上
#pragma once
就好了, 因为你多次包含一个头文件会导致 "对象重复定义 "
而#pragma once 告诉你, 只包含一次就好了.
确实是 "原封不动的把文件插入到#include "
[解决办法]
有的编译器能够显示能够显示预处理之后的代码。
好像gcc由这个功能。
VC可能也有这个功能。
[解决办法]
是的,这就是头文件的作用
[解决办法]
基本上是
可能会有包含保护的情况,老保证一个文件不被多次包含。实际上这是通过条件编译做到的,本质上还是把文件全部COPY过来。
[解决办法]
#include到底做了什么?
它将 包含的文件在 包含语句 的位置进行展开,
也就是所有的 include指定文件中定义的内容,
都将在这个 include 位置出现
(相当于把 h 文件的内容都拷贝到 include 语句的位置来)
所以,
重复定义是很显然的,
为了防止这个问题,
通常使用的有两种办法:
1 #pragma once 预编译指令, 该指令指示仅被包含一次
2 在h文件开头部分使用:
#ifndef XXX_H
#define XXX_H
...//这里是头文件的内容
#endif
通过 该预编译选择指令防止头文件被重复包含
[解决办法]
文本拷贝
[解决办法]
我不太理解C++编译器怎样处理#include "SomeFile.h "
在ASP中 #include "SomeFile "会原封不动的把SomeFile中的文本插入到#include处。
------------------------------------------------
在C++中,也是这样的“拷贝”过程。