c++编译问题:未声明的标识符

general.h内容如下:#pragmaonce#include"h1.h"#include<iostream>structTT{inta;intb;};再建一个h1.... general.h内容如下:
#pragma once
#include "h1.h"
#include <iostream>
struct TT
{
int a;
int b;
};
再建一个h1.h文件,内容如下:
#include "general.h"
using namespace std;
void print(TT t)
{
cout << "print" << t.a << " " << t.b << endl;
}

main.cpp里面调用print函数,提示错误,说未申明的标识符。。请问为什么??
main部分

#include "general.h"

using namespace std;

int main()
{
TT t;
t.a = 1;
t.b = 3;
print1(t);
print2(t);

system("PAUSE");
return 0;
}
在main里面include"h1.h"的话就不会有问题了,但是这样为什么不行??
展开
 我来答
直男救星来了
推荐于2017-09-12 · TA获得超过673个赞
知道小有建树答主
回答量:168
采纳率:100%
帮助的人:203万
展开全部
请贴main.cpp的源代码,问题在main.cpp里
补充:
在C和C++程序中,变量及方法的声明和调用是有顺序的。如果你在声明一个变量之前就已经使用了这个变量,就会出现未申明的标识符错误。
所以你的程序正常在声明、包含和调用的顺序应该是这样的。
general.h文件,声明结构体TT
#pragma once
/*
这里不需要#include "h1.h"
*/
#include <iostream>
struct TT
{
int a;
int b;
};
h1.h声明print方法,使用了结构体TT,需要#include "general.h",因为这个文件里包含了对TT的声明
#include "general.h"
using namespace std;
void print(TT t)
{
cout << "print" << t.a << " " << t.b << endl;
}
main部分
/*
这里不是#include "general.h",而是#include "h1.h",因为h1.h中即包含了print方法的声明,同时也#include "general.h"包含了对TT结构体的声明
*/
#include "h1.h"
using namespace std;
int main()
{
TT t;
t.a = 1;
t.b = 3;
print1(t);
print2(t);

system("PAUSE");
return 0;
}
yu2212
2011-05-11 · TA获得超过2391个赞
知道大有可为答主
回答量:3915
采纳率:0%
帮助的人:2960万
展开全部
你包含了h1.h main函数就知道print函数在哪里,

print函数被调用后用到TT 你包含了general.h 也能找到这个结构体,自然就编译通过了。

include 的方式,最后是把其他文件的内容插到main函数所在的文件里。。。等于写在一个源文件中。但include 顺序不一样,就找不到了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
rjsvu7862
2011-05-12 · TA获得超过476个赞
知道答主
回答量:410
采纳率:100%
帮助的人:256万
展开全部
在类的声明里不要声明另一个类的对象,而要声明类的指针,比如
class A{
...
class B b;
...
};
是错的,因为在编译A时,无法确定B的大小,应该用
class A{
...
class B *b;
...
};
因为指针大小是固定的。

另外,嵌套声明时,在其中一个类的声明前面加上另一个类的预声明即可。
比如
在A.h里面写
class B;
class A{
...
};
在B.h里面写
class B{
...
};
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
豆尼王
2019-05-27
知道答主
回答量:1
采纳率:0%
帮助的人:741
展开全部
头文件不要互相包含,我之前互相包含就出错,说我自己写的类是未声明的类型
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
843299951
2011-05-10 · TA获得超过458个赞
知道小有建树答主
回答量:208
采纳率:0%
帮助的人:129万
展开全部
main里面又没包含h1.h头文件?或重复包含?
追问
求解答啊。。
追答
如果只#include" general.h"的话那么他就将下面代码顺序加main()前面去
void print(TT t)
{
cout << "print" << t.a << " " << t.b << endl;
}
struct TT
{
int a;
int b;
};
显然会出错TT结构用做参数在他定义之前,当然会说TT是未声明标识符。
而你#inlcude""general.h"
mian(){
#include"h1.h"
}
也就是#inlcude""general.h"在前, #include"h1.h"在后,则

void print(TT t)
{
cout << "print" << t.a << " " << t.b << endl;
}
struct TT
{
int a;
int b;
};
void print(TT t)
{
cout << "print" << t.a << " " << t.b << endl;
}
然后调用下面的print();
我猜这样,对于你的这个问题也只能这样想了,也许是编译器自己优化了代码,也许是c++的潜在的问题.,也许与#pragma once有关..没必要过于追究,记得就行了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式