关于头文件重复包含的问题

时间:2021-12-20 16:46:34
在学习函数的时候,调用其他文件的函数时提示“包含文件太多 : 深度 = 1024”,经搜索后知道是头文件重复包含导致的.
在尝试使用
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
   ...
   #endif

#pragma once
解决时仍没有解决问题,可能是我没有理解原理。
工程结构:
关于头文件重复包含的问题

1208.cpp:

#include "Test.h"
void main()
{
fun();
system("pause");
}

1208_01.cpp:

#include "Test.h"
void fun()
{
printf("%s\n",TEST);

}

Test.h:
#include <stdio.h>
#include <windows.h>
#include "1208_01.cpp"
#define TEST "调用其他文件的函数"

void fun();


在Test.h第一行加 #pragma once 后提示:
引用
1>e:\visual studio 2015\projects\test_1208\test_1208\1208_01.cpp(5): error C2065: “TEST”: 未声明的标识符
1>e:\visual studio 2015\projects\test_1208\test_1208\1208_01.cpp(4): error C2084: 函数“void fun(void)”已有主体
1>  e:\visual studio 2015\projects\test_1208\test_1208\1208_01.cpp(3): note: 参见“fun”的前一个定义

改为:
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
...
#endif 
也是一样的错误。

14 个解决方案

#1


#ifndef TEST_H_
#define TEST_H_
...
...
...
#endif
并去掉头文件中包含的1208_1.cpp

#2


#include "1208_01.cpp"   这就是在作死,  虽然语法上能通过.

一般来说include的只应该是.h文件.

再有.一般来说.   全局函数, 全局变量都不要在.h文件中实现.    .h文件中只应该存在声明.

你的问题解决办法:  
去掉下面这句
#include "1208_01.cpp"

因为你的fun已经在下面声明了.  编译器会自动去找实现的地方来连接.

#3


头文件最开始加上 #param once
保证你的头文件只编译一遍

#4


写错了是 #pragma once

#5


是阿,怎么把CPP都包含进来了?这是不好的设计模式

#6


你把cpp包括进来了,就会重定义啊,头文件只声明不定义的原因就是防止重定义,你要使用1208里面的函数只要弄个头文件定义一下,然后用cpp实现也能包括进来

#7


cpp文件不用包含,你加入工程就行(从截图你已经加入了)

#8


楼主我用你的代码做了下实验
#ifndef  _test_
#define _test_
#include <stdio.h>
#include <windows.h>
#include "1208_01.c"
#define TEST "调用其他文件的函数"
 
void fun();
#endif
问题有两点 
1 #include "1208_01.c“ 相当于文本替换,编译1208.c因此这里printf("%s",TEST)与之后的#define TEST "调用其他文件的函数
出现了问题,对调二者位置,
2 已有fun主体的问题,
在你编译了1208.c之后,1208.obj文件中已经包含了fun函数代码,我用dumpbin看的,我于是在工程中删掉1208_01.c,再组建,不编译1208.c之后可以形成.exe文件,运行有打印,证明确实有fun

#9


是不是在Test.h包含1208_01.cpp后编译,会存在两个fun()函数的定义。

#10


test.h包含1208_01.c后,#include “test.h”这句就会被替换为1208_01.c的内容

#11


CPP文件不需要包含

#12


楼主,你的代码问题出现在#define TEST这一行;

如果代码中多处出现这一行时,编译会出问题,可以把这行删除,然后在Test.h头文件中添加如下行:

LINE01:  #ifndef  __TEST_HEADER_FILE__
LINE02:  #define  __TEST_HEADER_FILE__

// 定义的其它功能性代码

LINE END: #endif  // #define  __TEST_HEADER_FILE__

#13


感谢各位,理解了。

#14


再次感谢各位!

#1


#ifndef TEST_H_
#define TEST_H_
...
...
...
#endif
并去掉头文件中包含的1208_1.cpp

#2


#include "1208_01.cpp"   这就是在作死,  虽然语法上能通过.

一般来说include的只应该是.h文件.

再有.一般来说.   全局函数, 全局变量都不要在.h文件中实现.    .h文件中只应该存在声明.

你的问题解决办法:  
去掉下面这句
#include "1208_01.cpp"

因为你的fun已经在下面声明了.  编译器会自动去找实现的地方来连接.

#3


头文件最开始加上 #param once
保证你的头文件只编译一遍

#4


写错了是 #pragma once

#5


是阿,怎么把CPP都包含进来了?这是不好的设计模式

#6


你把cpp包括进来了,就会重定义啊,头文件只声明不定义的原因就是防止重定义,你要使用1208里面的函数只要弄个头文件定义一下,然后用cpp实现也能包括进来

#7


cpp文件不用包含,你加入工程就行(从截图你已经加入了)

#8


楼主我用你的代码做了下实验
#ifndef  _test_
#define _test_
#include <stdio.h>
#include <windows.h>
#include "1208_01.c"
#define TEST "调用其他文件的函数"
 
void fun();
#endif
问题有两点 
1 #include "1208_01.c“ 相当于文本替换,编译1208.c因此这里printf("%s",TEST)与之后的#define TEST "调用其他文件的函数
出现了问题,对调二者位置,
2 已有fun主体的问题,
在你编译了1208.c之后,1208.obj文件中已经包含了fun函数代码,我用dumpbin看的,我于是在工程中删掉1208_01.c,再组建,不编译1208.c之后可以形成.exe文件,运行有打印,证明确实有fun

#9


是不是在Test.h包含1208_01.cpp后编译,会存在两个fun()函数的定义。

#10


test.h包含1208_01.c后,#include “test.h”这句就会被替换为1208_01.c的内容

#11


CPP文件不需要包含

#12


楼主,你的代码问题出现在#define TEST这一行;

如果代码中多处出现这一行时,编译会出问题,可以把这行删除,然后在Test.h头文件中添加如下行:

LINE01:  #ifndef  __TEST_HEADER_FILE__
LINE02:  #define  __TEST_HEADER_FILE__

// 定义的其它功能性代码

LINE END: #endif  // #define  __TEST_HEADER_FILE__

#13


感谢各位,理解了。

#14


再次感谢各位!