C++處理頭文件互相循環包含,導致變量或類未定義

先說解決辦法:
  1. 第一種方法
    把用到的那個變量或類單放置在一個頭文件裏面。
  2. 第二種方法
    在報錯的的文件中添加這個報錯變量的定義,如class A;

原理

  這樣做的原理其實很簡單,只是因爲在C++中,include頭文件只是把文件展開後添加到源代碼中,如果你一項一項的展開後,就會發現報錯的變量真的沒有定義,展開分析即可。
  注意:在進行展開分析時,不要只對兩個互相包含的頭文件展開,還要展開其他的包含這個頭文件的文件,所以,如果工程比較大的話,展開還不是很容易,所以,可以自己寫一個小的Demo進行測試。
  我的工程樣如下:
h1.h

#pragma once
#ifndef h1_h__
#define h1_h__
#include "h2.h"
typedef struct userInfo_def{
	int a;
	int b;
	int c;
}userInfo;
void h1(userInfo* p){
}

#endif // h1_h__


h2.h

#ifndef h2_h__
#define h2_h__

#include "h1.h"
typedef struct userInfo_def userInfo;

void fun(userInfo* p){
	return;
}
#endif // h2_h__

main.cpp

#include<iostream>
using namespace std;
#include "h1.h"

int main(){
	userInfo* p;
	p = new userInfo();
	return 0;
}

  此時應該展開的是在main.cpp文件中展開h1.h,這時纔可以進行分析,我展開的文件如下。注:裏面的防止頭文件重複包含 的宏去掉了:

#pragma once
///////////////////////////////////////

// 這裏就是h2.h中添加的內容,如果不添加,fun函數就會報錯
typedef struct userInfo_def userInfo;

void fun(userInfo* p){
	return;
}
//////////////////////////////////
// h1.h
typedef struct userInfo_def
{
	int a;
	int b;
	int c;
}userInfo;

void h1(userInfo* p){
}
//////////////////////////////////////////////
int main(){
	userInfo* p;
	p = new userInfo();

	return 0;
}

  當然,你還可以使用編譯自動展開,但是生成的文件會很大,編譯器設置如下,我的開發原境是VS2015,操作步驟如下:


右擊項目->屬性->C/C++->預處理到文件->是

  在修改完成後,還要再修改回來,否則就會無法生成工程了。生成的文件就在debug/release文件夾下,文件名是main.i,因爲我的主文件是main.cpp,所以生成的文件就是main.i,你要根據自己的工程來進行相應的判斷。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章