0

假设我有a.h以下内容:

<stdbool.h>
<stddef.h>
<stdin.h>

假设我也有b.h其中还包括<stdbool.h>. 如果a.h其中有#ifndef预处理器定义语句并且b.h没有。将a.h仅包含未包含的内容b.h?那么当b.h包含时a.h,将a.h包含stddef.hstein.h不重新包含stdbool.h,还是那些预处理器定义函数仅用于查看整个类是否被重新定义,而不是其中的特定函数?

编辑:

此外,假设b.h包含另一个头文件,其中包含-stdbool.h使得该类和. 这会导致错误吗?b.hstdbool.ha.h

4

3 回答 3

1

如果stdbool.h它本身包含守卫(#ifndef),那么一切都会好起来的。否则,您可能确实会包含一些标题两次。会不会造成问题?这取决于。如果包含两次的标头仅包含声明,那么所有内容都将编译 - 它只需要几纳秒的时间。想象一下:

int the_answer(void); // <-- from first inclusion
int the_answer(void); // <-- from from second inclusion - this is OK
                      //       at least as long as declarations are the same

int main()
{
    return the_answer();
}

另一方面,如果会有定义,则会导致错误:

int the_answer(void)  // <-- from first inclusion - OK so far
{
    return 42;
}

int the_answer(void)  // <-- from second inclusion
{                     //     error: redefinition of 'the_answer'
    return 42;
}

int main()
{
    return the_answer();
}
于 2012-03-13T19:13:47.167 回答
1

必须制作所有 C 标准头文件,以便它们可以按任意顺序多次包含:

标准标题可以以任何顺序包含;每个都可以在给定范围内多次包含,与仅包含一次没有任何不同的效果

于 2012-03-13T19:16:52.540 回答
0

大多数标题以开头是正常的

#ifndef _HEADERFILENAME_H_
#define _HEADERFILENAME_H_

并以以下行结束:

#endif

如果您两次包含标头,那么您的程序第二次将不再包含完整的标头,因为#ifndef,#define#endif

于 2012-03-13T19:52:25.413 回答