VC如何解决重复包含头文件的问题
比如stdafx.h,它里面有#pragmaonce,所以只能被用一次,但是像一些#include<string>这样的,它内部也有#pragmaonce,有点废话。1。...
比如stdafx.h ,它里面有#pragma once,所以只能被用一次,但是像一些
#include <string>这样的,它内部也有#pragma once,有点废话。
1。头文件是不参与编译的,那他的作用应该是声明的作用吧,或者还有别的什么作用。
2。假如头文件是声明的作用,那我如果不要头文件,把头文件的内容放到cpp里,那头文件的这部分内容是不是也参与编译了啊。
3。比如4个cpp文件,每个cpp都用到了string,所以都#include <string>,但是实际只打开了一次,那能不能只在一个cpp里写#include <string>,其他3个不写了呢?如果其他3个必须写,那是为什么呢。
C++学了半年多了,但是有的问题一直很模糊,希望明白的解答。
这种事为了防止同一个CPP包含相同的。h呢?
还是为了防止多个不同的CPP包含一个相同的.H头文件呢
还有一个想知道的是:假如为了防止多个不同的CPP包含一个相同的.H头文件,预编译的时候,肯定只把第一个cpp里加入了。h里的内容,然后定义了string_h,以后的cpp文件看已经定义了string_h,那就不会包含。h的内容了,我想知道的是,既然这样,那可以不只在一个cpp里写#include“”,其他需要包含这个头文件的cpp就不写了呢,告诉我为什么啊,
也就是:
#ifndef string_h
#define string_h
#endif
这种是为了防止一个CPP中包含多个相同的头文件?
还是为了防止多个cpp包含同一个。h的头文件啊?
应该都是吧?
就先说第2个吧,假设为了防止多个cpp包含同一个。h的头文件。
假设2个cpp(1.cpp,2.cpp)同时包含a。h头文件,a.h头文件定义了
#ifndef string_h
#define string_h
#endif
这种方式
假设编译器首先编译1.cpp,然后把a.h的内容编译进去了,同时定义了string_h,而2.cpp预编译的时候发现string_h已被定义,所以a.h的内容就没被2.cpp包含,那我想知道既然a.h没被2.cpp展开编译,能不能在2.cpp中不写#include“a.h”啊,好像必须要写啊,为什么啊 展开
#include <string>这样的,它内部也有#pragma once,有点废话。
1。头文件是不参与编译的,那他的作用应该是声明的作用吧,或者还有别的什么作用。
2。假如头文件是声明的作用,那我如果不要头文件,把头文件的内容放到cpp里,那头文件的这部分内容是不是也参与编译了啊。
3。比如4个cpp文件,每个cpp都用到了string,所以都#include <string>,但是实际只打开了一次,那能不能只在一个cpp里写#include <string>,其他3个不写了呢?如果其他3个必须写,那是为什么呢。
C++学了半年多了,但是有的问题一直很模糊,希望明白的解答。
这种事为了防止同一个CPP包含相同的。h呢?
还是为了防止多个不同的CPP包含一个相同的.H头文件呢
还有一个想知道的是:假如为了防止多个不同的CPP包含一个相同的.H头文件,预编译的时候,肯定只把第一个cpp里加入了。h里的内容,然后定义了string_h,以后的cpp文件看已经定义了string_h,那就不会包含。h的内容了,我想知道的是,既然这样,那可以不只在一个cpp里写#include“”,其他需要包含这个头文件的cpp就不写了呢,告诉我为什么啊,
也就是:
#ifndef string_h
#define string_h
#endif
这种是为了防止一个CPP中包含多个相同的头文件?
还是为了防止多个cpp包含同一个。h的头文件啊?
应该都是吧?
就先说第2个吧,假设为了防止多个cpp包含同一个。h的头文件。
假设2个cpp(1.cpp,2.cpp)同时包含a。h头文件,a.h头文件定义了
#ifndef string_h
#define string_h
#endif
这种方式
假设编译器首先编译1.cpp,然后把a.h的内容编译进去了,同时定义了string_h,而2.cpp预编译的时候发现string_h已被定义,所以a.h的内容就没被2.cpp包含,那我想知道既然a.h没被2.cpp展开编译,能不能在2.cpp中不写#include“a.h”啊,好像必须要写啊,为什么啊 展开
5个回答
展开全部
语法上对头文件里的内容没有任何限制
c++语法有个要求就是任何名字(类型、变量或者函数什么的)都要“先声明后使用”,注意这个要求的范围是在同一个文件里,就是说你这个.cpp里用到的东西必须在你这个.cpp里先有声明。 如果你要用string类的变量, 你就必须先写清楚这个类型的声明,编译器才知道怎么去编译这一段。 所以你要是不怕累的话你可以就挨个用到的地方重复写一下,但是因为这个可能很麻烦, 也可能会几个地方写的不一致, 解决办法就是采用一个头文件,每个地方都include这个头文件, 就相当于写了这个类型的声明。 include命令的作用就是把那个头文件的内容复制到这里来, 至于头文件里面到底写了什么其实是没有语法要求的,但是如上所述, 头文件既然主要是解决这个声明的问题, 所以当然你看到的头文件里主要内容还都是声明。 现在模板横行的时候由于一些技术问题造成头文件里也写了很多实现, 这个解释起来有点麻烦,你可以不搭理它
所以总结一下, C语言要求先声明后使用,所以用头文件来形成一个统一声明, 而之所以要防止重复include头文件,是因为一个cpp里一个名字是不可以被定义多次的, 所以对那些声明=定义的东西如果重复include了,编译的时候就容易出现重复定义的错误,当然对有些声明跟定义截然分开的情况来说,重复include也没问题
c++语法有个要求就是任何名字(类型、变量或者函数什么的)都要“先声明后使用”,注意这个要求的范围是在同一个文件里,就是说你这个.cpp里用到的东西必须在你这个.cpp里先有声明。 如果你要用string类的变量, 你就必须先写清楚这个类型的声明,编译器才知道怎么去编译这一段。 所以你要是不怕累的话你可以就挨个用到的地方重复写一下,但是因为这个可能很麻烦, 也可能会几个地方写的不一致, 解决办法就是采用一个头文件,每个地方都include这个头文件, 就相当于写了这个类型的声明。 include命令的作用就是把那个头文件的内容复制到这里来, 至于头文件里面到底写了什么其实是没有语法要求的,但是如上所述, 头文件既然主要是解决这个声明的问题, 所以当然你看到的头文件里主要内容还都是声明。 现在模板横行的时候由于一些技术问题造成头文件里也写了很多实现, 这个解释起来有点麻烦,你可以不搭理它
所以总结一下, C语言要求先声明后使用,所以用头文件来形成一个统一声明, 而之所以要防止重复include头文件,是因为一个cpp里一个名字是不可以被定义多次的, 所以对那些声明=定义的东西如果重复include了,编译的时候就容易出现重复定义的错误,当然对有些声明跟定义截然分开的情况来说,重复include也没问题
展开全部
1、主要作用是声明,并不分配内存
2、不编译的还是不编译,编不编译不是看区域,而是看内容,就好像宏定义一样,放在哪里都是预编译的
3、头文件只对包含了该头文件的源程序文件起作用,所以4个cpp文件都需要包含这个头文件
~~~~~~~~
还有什么不清楚的可以直接用百度Hi
2、不编译的还是不编译,编不编译不是看区域,而是看内容,就好像宏定义一样,放在哪里都是预编译的
3、头文件只对包含了该头文件的源程序文件起作用,所以4个cpp文件都需要包含这个头文件
~~~~~~~~
还有什么不清楚的可以直接用百度Hi
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在每个.h里加上条件编译的开关,如,yourfile.h可以这样:
// .h文件最开始:
#ifndef _YOUR_FILE_H_
#define _YOUR_FILE_H_
// .h文件内容
// .h文件末尾:
#endif
// .h文件最开始:
#ifndef _YOUR_FILE_H_
#define _YOUR_FILE_H_
// .h文件内容
// .h文件末尾:
#endif
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1.头文件是否参与编译,我觉得应该参与的,你想啊,有些成员函数直接在类定义中实现的,还有些成员函数有默认参数值,如果头文件不参与编译的话,仅凭cpp文件是无法获取这些信息的。
2.那是肯定的了。
3.如果4个cpp文件都使用了string类,可以只在一个文件包含string,如文件A中#include <string>,但是另外三个文件B、C、D中必须#include<A> ,一个类在使用前必须作声明。
2.那是肯定的了。
3.如果4个cpp文件都使用了string类,可以只在一个文件包含string,如文件A中#include <string>,但是另外三个文件B、C、D中必须#include<A> ,一个类在使用前必须作声明。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include<string>
using namespace std;
#ifndef string_h
#define string_h
void main()
{
...
}
#endif
应该是这样吧。。保证头文件只被编译过一次
using namespace std;
#ifndef string_h
#define string_h
void main()
{
...
}
#endif
应该是这样吧。。保证头文件只被编译过一次
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询