我在一个头文件中包含了另外一个头文件,如果我把这个被包含的头文件移动到实现文件中,为什么就编译不过呢?
例如:
// main.h
#include "test.h"
...
//end
// main.c
#include "main.h"
...
//end
现在改为:
//main.h
...
// end
// main.c
#include "test.h"
#include "main.h"
....
//end
改后就不能编译通过呢,
其中main.h使用test.h中声明的用户自定义类型。
15 个解决方案
#1
#pragma once ???
#2
具体出错原因!!
#3
在test中加:
#ifndef _test_h_
#define _test_h_
#endif
#ifndef _test_h_
#define _test_h_
#endif
#4
... 其实对文件编译也没什么东西!
只要你理解这东西是什么就会了~
比如
mail.c 文件:
#include "stdio.h"
int main(void)
{
return 0;
}
编译的时候基本就是把#include "stdio.h"行换成stdio.h文件的内容!
呵呵
只要你理解这东西是什么就会了~
比如
mail.c 文件:
#include "stdio.h"
int main(void)
{
return 0;
}
编译的时候基本就是把#include "stdio.h"行换成stdio.h文件的内容!
呵呵
#5
增加一个 限制一次包含 指令 ...
#pragma once
或者
#ifndef _test_h_
#define _test_h_
...
#endif
#pragma once
或者
#ifndef _test_h_
#define _test_h_
...
#endif
#6
加上
#pragma once
#pragma once
#7
其中main.h使用test.h中声明的用户自定义类型。
这个时候需要在main.h中包含test.h
如果你main的头文件中没有test中声明的用户自定义类型的话,不需要
这个时候需要在main.h中包含test.h
如果你main的头文件中没有test中声明的用户自定义类型的话,不需要
#8
同意 peterID
问一下 预处理命令 #pragma once 什么意思啊!具体点
问一下 预处理命令 #pragma once 什么意思啊!具体点
#9
// main.c
#include "main.h"
#include "test.h"
....
//end
这样试试
#include "main.h"
#include "test.h"
....
//end
这样试试
#10
同意peterID(peter)
正解
正解
#11
看上去不是重复包含头文件的问题。
你的错误提示是什么?
是不是有别的文件包含了main.h,但没有包含test.h?
你的错误提示是什么?
是不是有别的文件包含了main.h,但没有包含test.h?
#12
请问 peterID:
你是这样说的:
这个时候需要在main.h中包含test.h
如果你main的头文件中没有test中声明的用户自定义类型的话,不需要
我在main.h中使用了test中声明的用户自定义类型。我就是觉得奇怪,我为什么不可以将放在main.h中的test.h去掉。而在实现文件中在包含main.h文件前先包含test.h呢。
我个人理解应该是一样的,但编译通不过。一个工程,它的具体编译过程是具体是怎样编译的。
谢谢!
你是这样说的:
这个时候需要在main.h中包含test.h
如果你main的头文件中没有test中声明的用户自定义类型的话,不需要
我在main.h中使用了test中声明的用户自定义类型。我就是觉得奇怪,我为什么不可以将放在main.h中的test.h去掉。而在实现文件中在包含main.h文件前先包含test.h呢。
我个人理解应该是一样的,但编译通不过。一个工程,它的具体编译过程是具体是怎样编译的。
谢谢!
#13
谢谢:yzx1983(捕风捉影)
确实是这个问题,我工程里有很多文件都包含了main.h,我只注意到其中一个实现文件。你提醒了我,请问怎么操作给分啊。
确实是这个问题,我工程里有很多文件都包含了main.h,我只注意到其中一个实现文件。你提醒了我,请问怎么操作给分啊。
#14
点击这页上面的“管理”给分
#15
再请教:
#include"test1.h"
#include"test2.h"
肯定是test1.h先编译吗?
我使用的是BC31环境,我想在头文件代码中加入#pragma message("test1.h")这样的预编译命令来判断谁先编译,但不起作用,好像#pragma message BC31 不支持,请问 BC31下 用什么样的命令能实现这个结果
#include"test1.h"
#include"test2.h"
肯定是test1.h先编译吗?
我使用的是BC31环境,我想在头文件代码中加入#pragma message("test1.h")这样的预编译命令来判断谁先编译,但不起作用,好像#pragma message BC31 不支持,请问 BC31下 用什么样的命令能实现这个结果
#1
#pragma once ???
#2
具体出错原因!!
#3
在test中加:
#ifndef _test_h_
#define _test_h_
#endif
#ifndef _test_h_
#define _test_h_
#endif
#4
... 其实对文件编译也没什么东西!
只要你理解这东西是什么就会了~
比如
mail.c 文件:
#include "stdio.h"
int main(void)
{
return 0;
}
编译的时候基本就是把#include "stdio.h"行换成stdio.h文件的内容!
呵呵
只要你理解这东西是什么就会了~
比如
mail.c 文件:
#include "stdio.h"
int main(void)
{
return 0;
}
编译的时候基本就是把#include "stdio.h"行换成stdio.h文件的内容!
呵呵
#5
增加一个 限制一次包含 指令 ...
#pragma once
或者
#ifndef _test_h_
#define _test_h_
...
#endif
#pragma once
或者
#ifndef _test_h_
#define _test_h_
...
#endif
#6
加上
#pragma once
#pragma once
#7
其中main.h使用test.h中声明的用户自定义类型。
这个时候需要在main.h中包含test.h
如果你main的头文件中没有test中声明的用户自定义类型的话,不需要
这个时候需要在main.h中包含test.h
如果你main的头文件中没有test中声明的用户自定义类型的话,不需要
#8
同意 peterID
问一下 预处理命令 #pragma once 什么意思啊!具体点
问一下 预处理命令 #pragma once 什么意思啊!具体点
#9
// main.c
#include "main.h"
#include "test.h"
....
//end
这样试试
#include "main.h"
#include "test.h"
....
//end
这样试试
#10
同意peterID(peter)
正解
正解
#11
看上去不是重复包含头文件的问题。
你的错误提示是什么?
是不是有别的文件包含了main.h,但没有包含test.h?
你的错误提示是什么?
是不是有别的文件包含了main.h,但没有包含test.h?
#12
请问 peterID:
你是这样说的:
这个时候需要在main.h中包含test.h
如果你main的头文件中没有test中声明的用户自定义类型的话,不需要
我在main.h中使用了test中声明的用户自定义类型。我就是觉得奇怪,我为什么不可以将放在main.h中的test.h去掉。而在实现文件中在包含main.h文件前先包含test.h呢。
我个人理解应该是一样的,但编译通不过。一个工程,它的具体编译过程是具体是怎样编译的。
谢谢!
你是这样说的:
这个时候需要在main.h中包含test.h
如果你main的头文件中没有test中声明的用户自定义类型的话,不需要
我在main.h中使用了test中声明的用户自定义类型。我就是觉得奇怪,我为什么不可以将放在main.h中的test.h去掉。而在实现文件中在包含main.h文件前先包含test.h呢。
我个人理解应该是一样的,但编译通不过。一个工程,它的具体编译过程是具体是怎样编译的。
谢谢!
#13
谢谢:yzx1983(捕风捉影)
确实是这个问题,我工程里有很多文件都包含了main.h,我只注意到其中一个实现文件。你提醒了我,请问怎么操作给分啊。
确实是这个问题,我工程里有很多文件都包含了main.h,我只注意到其中一个实现文件。你提醒了我,请问怎么操作给分啊。
#14
点击这页上面的“管理”给分
#15
再请教:
#include"test1.h"
#include"test2.h"
肯定是test1.h先编译吗?
我使用的是BC31环境,我想在头文件代码中加入#pragma message("test1.h")这样的预编译命令来判断谁先编译,但不起作用,好像#pragma message BC31 不支持,请问 BC31下 用什么样的命令能实现这个结果
#include"test1.h"
#include"test2.h"
肯定是test1.h先编译吗?
我使用的是BC31环境,我想在头文件代码中加入#pragma message("test1.h")这样的预编译命令来判断谁先编译,但不起作用,好像#pragma message BC31 不支持,请问 BC31下 用什么样的命令能实现这个结果