c头文件相互包含,关于c头文件相互包含的问题

1,关于c头文件相互包含的问题你不可能都需要前置定义的 , 肯定只有一个需要你的问题在于,对于前置定义,你不可能在实际实现被提供前使用其具体接口,下面代码StrBlobPtr begin()是不允许在此时“实现”的,你只能在这先定义函数,然后在有StrBlobPtr定义后再实现此处也不允许使用StrBlobPtr作为返回值,因为它需要拷贝构造函数,你只能返回指针或者引用
2,c语言 头文件互相包含怎么办如果不在工程同一个目录下,就得用绝对路径#include<文件路径>或#include"文件路径"文件路径可以是绝对路径,如:c:\text.h#include "c:\text.h"1234567891011121314 头文件先把函数声明一下 , 如:.h文件:intfunc_a();intfunc_b();a.c文件intfunc_a() //实现}b.c文件intfunc_b() //实现}【c头文件相互包含,关于c头文件相互包含的问题】
3,c 中如果两个文件互相包含其语法应该是怎样在A.h里加上class B;或者在B.h里加上class A;这叫做预声明.可以采用这个办法: 以line.h为例: 在line.h的前面加一个声明:class point; 这样就可以使用point类了 , 不过这 需要使用指针的形式,如point* p1; 而且在cpp文件里需要包含 point.h; 这样就可以避免类之间的相互调用 。在其中某个类的h文件中声明一下另一个类而不是include另一个类就可以了换句话说,在A类的h文件里这样写A.h:#ifndef AH#define AHclass B; //#include "B.h"....#endif 然后在A类的cpp文件里这样写A.cpp:#include "A.h"#include "B.h"...B类的处理也一样即可
4,C两个头文件互相包含对方编译无法通过怎么办这是因为头文件只能包含一次,可以用宏定义来解决这个问题 。在你的Line和Point两个.h文件中分别加入下面的代码://Line.h#ifndef _LINE_H#define _LINE_H// 你自己的代码#endif//---------------------------------------------// Point.h#ifndef _POINT_H#define _POINT_H// 你自己的代码#endif其次,如果是VC,在这两个头文件最开头加#pragma once也能达到同样效果 。谢谢,望采纳 。#ifndef #define ... #endif对此肯定起作用的(只要定义得当) 。理论上,同一个头文件#include多次是没关系的,只要头文件符合标准并使用了#ifndef #define ... #endif进行控制 。所以你应该是还有别的问题 。如果可以的话 , 我需要看一下你的各个头文件,才能确定具体的问题所在 。你先要确保:#ifndef #define ... #endif格式正确:#ifndef _a_xxxx_h_/* 这个名称只要不重复是无所谓的 */#define _a_xxxx_h_/* 要和上面的一样 */... #endif5,C怎么让两个头文件相互包含在头文件用下面的宏把代码包起来,这样可以防止重复 。你说的相互包含,没有问题的啊 。#ifndef _FILENAME_H#define _FILENAME_H#endif可以通过预处理宏来控制重复包含的问题如果是模板类 , 那么类成员函数声明为内联的即可 例如 //A.h #pragma once#include "B.h"template<typename T> class B; template<typename T> class Apublic: A(B<T>* b=NULL):b_(b) void SetPtr(B<T>* b)b_ = b; } void CallFuncFromB()b_->PrintfB(); } void PrintfA()cout<<"PrintfA"<<endl; }public: B<T>* b_;};//B.h#pragma once#include "A.h"template<typename T> class A;template<typename T> class Bpublic: B(A<T>* a=NULL):a_(a) void SetPtr(A<T>* a)a_ = a; } void CallFuncFromA()a_->PrintfA(); } void PrintfB()cout<<"PrintfB"<<endl; }public: A<T>* a_;};//main.cpp#include <iostream>#include "A.h"using namespace std;int main(int argc, char** argv) A<int> a; B<int> b; a.SetPtr(&b); b.SetPtr(&a); a.CallFuncFromB(); b.CallFuncFromA(); system("pause"); return 0;}//这种方法有一种限值条件,就是模板类A和B的模板参数要求一致 。两个头文件相互包含会导致超前引用的问题,所谓超前引用是指一个类型在定义之前就被用来定义变量和声明函数 。发生这种情况是无法编译通过的,不过可以采取一些手段解决该问题超前引用导致的错误有以下几种处理办法:1) 使用类声明在超前引用一个类之前,首先用一个特殊的语句说明该标识符是一个类名,即将被超前引用 。其使用方法是:a)用class classb;声明即将超前引用的类名b)定义class classac)定义class classb;d)编制两个类的实现代码 。上述方法适用于所有代码在同一个文件中,一般情况下,classa和classb分别有自己的头文件和cpp文件,这种方法需要演变成:a) 分别定义classa和classb,并在cpp文件中实现之b) 在两个头文件的开头分别用class classb;和class classa;声明对方c) 在两个cpp文件中分别包含另外一个类的头文件note:这种方法切记不可使用类名来定义变量和函数的变量参数,只可用来定义引用或者指针 。2) 使用全局变量由于全局变量可以避免超前引用,不用赘述 。我的习惯是,把类对象的extern语句加在该类头文件的最后,大家喜欢怎样写那都没有什么大问题,关键是保证不要在头文件中胡乱包含 。3) 使用基类指针 。这种方法是在引用超前引用类的地方一律用基类指针 。而一般情况下 , 两个互相引用的类并不涉及其基类 , 因此不会造成超前引用 。

    推荐阅读