一个公司的面试题目,关于预编译的

时间:2022-04-12 14:15:36
请问下列代码是否有错,如果有,错在何处?

在文件header1.h中:
#ifndef _HEADER1_H
#define _HEADER1_H
#include "header2.h"
其他声明
#endif

在文件header2.h中:
#ifndef _HEADER2_H
#define _HEADER2_H
#include "header1.h"
其他声明
#endif

29 个解决方案

#1


没错

#2


头文件互相包含

#3


对了

#4


看不懂啊。。。。

#5


看不出问题所在

#6


膜拜楼主结帖率

#7


头文件互相包含。。。预编译时会提示错误的

#8


假如两个都没有定义,则头文件互相包含。错误。

#9


基本费了

#10


没错啊,你可以做个测试嘛,就能很明白加这些宏是干嘛的了!

测试一:
在文件header2.h中: 
#ifndef _HEADER2_H 
#define _HEADER2_H 
#include "header1.h" 
#include "header1.h" //引用了2次都不会错哦

其他声明 
#endif

测试二:
在文件header2.h中: 
//#ifndef _HEADER2_H  //去掉这些宏
//#define _HEADER2_H 
#include "header1.h" 
#include "header1.h" //引用了2次就会错哦

其他声明 
//#endif

自己测试完就能明白了! 在实际应用中这些宏的使用几乎无处不在!

#11


有错,假设还有.c文件来包含以上两个.h文件中的任意一个,先包含header1.h,展开头文件,发现_HEADER1_H未定义,往下执行,到header1.h中的#include "header2.h"这句代码时,转到header2.h头文件中,发现_HEADER2_H未定义,往下执行,到header2.h中的#include "header1.h"这句代码,程序又转到header1.h中,这时发现_HEADER1_H已定义,将不执行下面的代码,包含header1.h未执行,你可以实际写段代码测试下,看可报错。

#12


在文件header1.h中: 
#ifndef _HEADER1_H 
#define _HEADER1_H 
#include "header2.h" 
其他声明 
#endif 

错误,#include "header3.h"应该放在#ifndef-#endif外面。
要不然就失去了#ifndef-#endif防止重复包含的意义。

#13


学习C/C++就要学习它的精髓。。。而不是简简单单的照猫画虎。。。

这里我们写#ifdef-#endif的作用是为了防止头文件被重复包含,而不是因为别人都这样这样写所以我这样写。

#14



header1.h:
#ifndef _HEADER1_H
#define _HEADER1_H
#include "header2.h"
int h1 = 1;
#endif

header2.h:
#ifndef _HEADER2_H
#define _HEADER2_H
#include "header1.h"
int h2 =2;
#endif

test.c:
#include <stdio.h>
#include "header1.h"
#include "header2.h"
int main()
{
    printf("%d\n", h1);
    printf("%d\n", h2);
}

输出结果:
1
2


上面是我测试的代码,根本没有上面大家说的错误存在。像13、14楼说的很有道理,但那时属于编程的良好习惯,并不说明这样就是错误的

#15


????看不出,下学期学了在来回答~

#16


晕死,上面有兄弟说“像13、14楼说的很有道理”,他自己就是14楼的……

#17


0分帖还不结帖

#18


没有错啊~~

#19


引用 16 楼 starwalker 的回复:
晕死,上面有兄弟说“像13、14楼说的很有道理”,他自己就是14楼的……

不好意思啊,昨晚忙着下线竟然弄错了,应该是12、13楼

#20


没有错误,就是为了防止互包含,而设置的宏。

#21


潜在错误,相互包含

#22


潜在错误,相互包含   --支持

#23


没意义

#24


没错就是没错...

#25


这个题目考核的#if...#endif的应用。这对操作目的就是减少多次引用同一个文件;对于这个在文件header1.h中: 
#ifndef _HEADER1_H 
#define _HEADER1_H 
#include "header2.h" 
其他声明 
#endif 

在文件header2.h中: 
#ifndef _HEADER2_H 
#define _HEADER2_H 
#include "header1.h" 
其他声明 
#endif

初看没有什么问题,但是当两个文件多定义了函数或宏等其它内容时,相互引用就会发现错误所在。编译会出现函数或宏重定义等。如果该为下面的写法,就不会出错了。header1.h中: 
#ifndef _HEADER1_H 
#define _HEADER1_H 
#ifndef _HEADER2_H 
#include "header2.h" 
#endif//_HEADER2_H 
其他声明 
#endif 

在文件header2.h中: 
#ifndef _HEADER2_H 
#define _HEADER2_H 
#ifndef _HEADER1_H 
#include "header1.h" 
#endif//_HEADER1_H 

其他声明 
#endif

#26


引用 25 楼 johnny_83 的回复:
这个题目考核的#if...#endif的应用。这对操作目的就是减少多次引用同一个文件;对于这个在文件header1.h中:
#ifndef _HEADER1_H
#define _HEADER1_H
#include "header2.h"
其他声明
#endif

在文件header2.h中:
#ifndef _HEADER2_H
#define _HEADER2_H
#include "header1.h"
其他声明
#endif

初看没有什么问题,但是当两个文件多定义了函数或宏等其它内容时,相互引用就会发现错误所在。编译会出现函数或宏重定义等。如果该为下面的写法,就不会出错了。header1.h中:
#ifndef _HEADER1_H
#define _HEADER1_H
#ifndef _HEADER2_H
#include "header2.h"
#endif//_HEADER2_H
其他声明
#endif

在文件header2.h中:
#ifndef _HEADER2_H
#define _HEADER2_H
#ifndef _HEADER1_H
#include "header1.h"
#endif//_HEADER1_H

其他声明
#endif

...

#27


引用 6 楼 laowu_ 的回复:
膜拜楼主结帖率

其实结贴率百分之百和百分之零对楼主和大家来说都没区别,压根儿就没分

#28


引用 25 楼 johnny_83 的回复:
这个题目考核的#if...#endif的应用。这对操作目的就是减少多次引用同一个文件;对于这个在文件header1.h中:
#ifndef _HEADER1_H
#define _HEADER1_H
#include "header2.h"
其他声明
#endif

在文件header2.h中:
#ifndef _HEADER2_H
#define _HEADER2_H
#include "header1.h"
其他声明
#endif

初看没有什么问题,但是当两个文件多定义了函数或宏等其它内容时,相互引用就会发现错误所在。编译会出现函数或宏重定义等。如果该为下面的写法,就不会出错了。header1.h中:
#ifndef _HEADER1_H
#define _HEADER1_H
#ifndef _HEADER2_H
#include "header2.h"
#endif//_HEADER2_H
其他声明
#endif

在文件header2.h中:
#ifndef _HEADER2_H
#define _HEADER2_H
#ifndef _HEADER1_H
#include "header1.h"
#endif//_HEADER1_H

其他声明
#endif


大哥,你这属烂用#if...#endif,直接把要包含的文件放外面就完了嘛,看看你写那么多#if...#endif,以后也极难维护。

#29


习惯不好。

#1


没错

#2


头文件互相包含

#3


对了

#4


看不懂啊。。。。

#5


看不出问题所在

#6


膜拜楼主结帖率

#7


头文件互相包含。。。预编译时会提示错误的

#8


假如两个都没有定义,则头文件互相包含。错误。

#9


基本费了

#10


没错啊,你可以做个测试嘛,就能很明白加这些宏是干嘛的了!

测试一:
在文件header2.h中: 
#ifndef _HEADER2_H 
#define _HEADER2_H 
#include "header1.h" 
#include "header1.h" //引用了2次都不会错哦

其他声明 
#endif

测试二:
在文件header2.h中: 
//#ifndef _HEADER2_H  //去掉这些宏
//#define _HEADER2_H 
#include "header1.h" 
#include "header1.h" //引用了2次就会错哦

其他声明 
//#endif

自己测试完就能明白了! 在实际应用中这些宏的使用几乎无处不在!

#11


有错,假设还有.c文件来包含以上两个.h文件中的任意一个,先包含header1.h,展开头文件,发现_HEADER1_H未定义,往下执行,到header1.h中的#include "header2.h"这句代码时,转到header2.h头文件中,发现_HEADER2_H未定义,往下执行,到header2.h中的#include "header1.h"这句代码,程序又转到header1.h中,这时发现_HEADER1_H已定义,将不执行下面的代码,包含header1.h未执行,你可以实际写段代码测试下,看可报错。

#12


在文件header1.h中: 
#ifndef _HEADER1_H 
#define _HEADER1_H 
#include "header2.h" 
其他声明 
#endif 

错误,#include "header3.h"应该放在#ifndef-#endif外面。
要不然就失去了#ifndef-#endif防止重复包含的意义。

#13


学习C/C++就要学习它的精髓。。。而不是简简单单的照猫画虎。。。

这里我们写#ifdef-#endif的作用是为了防止头文件被重复包含,而不是因为别人都这样这样写所以我这样写。

#14



header1.h:
#ifndef _HEADER1_H
#define _HEADER1_H
#include "header2.h"
int h1 = 1;
#endif

header2.h:
#ifndef _HEADER2_H
#define _HEADER2_H
#include "header1.h"
int h2 =2;
#endif

test.c:
#include <stdio.h>
#include "header1.h"
#include "header2.h"
int main()
{
    printf("%d\n", h1);
    printf("%d\n", h2);
}

输出结果:
1
2


上面是我测试的代码,根本没有上面大家说的错误存在。像13、14楼说的很有道理,但那时属于编程的良好习惯,并不说明这样就是错误的

#15


????看不出,下学期学了在来回答~

#16


晕死,上面有兄弟说“像13、14楼说的很有道理”,他自己就是14楼的……

#17


0分帖还不结帖

#18


没有错啊~~

#19


引用 16 楼 starwalker 的回复:
晕死,上面有兄弟说“像13、14楼说的很有道理”,他自己就是14楼的……

不好意思啊,昨晚忙着下线竟然弄错了,应该是12、13楼

#20


没有错误,就是为了防止互包含,而设置的宏。

#21


潜在错误,相互包含

#22


潜在错误,相互包含   --支持

#23


没意义

#24


没错就是没错...

#25


这个题目考核的#if...#endif的应用。这对操作目的就是减少多次引用同一个文件;对于这个在文件header1.h中: 
#ifndef _HEADER1_H 
#define _HEADER1_H 
#include "header2.h" 
其他声明 
#endif 

在文件header2.h中: 
#ifndef _HEADER2_H 
#define _HEADER2_H 
#include "header1.h" 
其他声明 
#endif

初看没有什么问题,但是当两个文件多定义了函数或宏等其它内容时,相互引用就会发现错误所在。编译会出现函数或宏重定义等。如果该为下面的写法,就不会出错了。header1.h中: 
#ifndef _HEADER1_H 
#define _HEADER1_H 
#ifndef _HEADER2_H 
#include "header2.h" 
#endif//_HEADER2_H 
其他声明 
#endif 

在文件header2.h中: 
#ifndef _HEADER2_H 
#define _HEADER2_H 
#ifndef _HEADER1_H 
#include "header1.h" 
#endif//_HEADER1_H 

其他声明 
#endif

#26


引用 25 楼 johnny_83 的回复:
这个题目考核的#if...#endif的应用。这对操作目的就是减少多次引用同一个文件;对于这个在文件header1.h中:
#ifndef _HEADER1_H
#define _HEADER1_H
#include "header2.h"
其他声明
#endif

在文件header2.h中:
#ifndef _HEADER2_H
#define _HEADER2_H
#include "header1.h"
其他声明
#endif

初看没有什么问题,但是当两个文件多定义了函数或宏等其它内容时,相互引用就会发现错误所在。编译会出现函数或宏重定义等。如果该为下面的写法,就不会出错了。header1.h中:
#ifndef _HEADER1_H
#define _HEADER1_H
#ifndef _HEADER2_H
#include "header2.h"
#endif//_HEADER2_H
其他声明
#endif

在文件header2.h中:
#ifndef _HEADER2_H
#define _HEADER2_H
#ifndef _HEADER1_H
#include "header1.h"
#endif//_HEADER1_H

其他声明
#endif

...

#27


引用 6 楼 laowu_ 的回复:
膜拜楼主结帖率

其实结贴率百分之百和百分之零对楼主和大家来说都没区别,压根儿就没分

#28


引用 25 楼 johnny_83 的回复:
这个题目考核的#if...#endif的应用。这对操作目的就是减少多次引用同一个文件;对于这个在文件header1.h中:
#ifndef _HEADER1_H
#define _HEADER1_H
#include "header2.h"
其他声明
#endif

在文件header2.h中:
#ifndef _HEADER2_H
#define _HEADER2_H
#include "header1.h"
其他声明
#endif

初看没有什么问题,但是当两个文件多定义了函数或宏等其它内容时,相互引用就会发现错误所在。编译会出现函数或宏重定义等。如果该为下面的写法,就不会出错了。header1.h中:
#ifndef _HEADER1_H
#define _HEADER1_H
#ifndef _HEADER2_H
#include "header2.h"
#endif//_HEADER2_H
其他声明
#endif

在文件header2.h中:
#ifndef _HEADER2_H
#define _HEADER2_H
#ifndef _HEADER1_H
#include "header1.h"
#endif//_HEADER1_H

其他声明
#endif


大哥,你这属烂用#if...#endif,直接把要包含的文件放外面就完了嘛,看看你写那么多#if...#endif,以后也极难维护。

#29


习惯不好。