先說解決辦法:
- 第一種方法
把用到的那個變量或類單放置在一個頭文件裏面。 - 第二種方法
在報錯的的文件中添加這個報錯變量的定義,如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
,你要根據自己的工程來進行相應的判斷。