繁体   English   中英

预处理器#ifndef

[英]Preprocessor #ifndef

假设我有ah ,其中包括以下内容:

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

假设我也有bh ,其中还包括<stdbool.h> 如果ah#ifndef预处理器定义语句,而bh没有。 请问ah只包括bh没有包含的内容吗? 所以,当bh包括ah ,会ah包括stddef.hstein.h ,而不是重新加入stdbool.h或仅见惯了这种全班是否被重新定义的预处理器定义的功能,并在它不是具体的功能呢?

编辑:

另外,假设bh包含另一个包含stdbool.h头文件 - 这使得bh从该类中获得了stdbool.hah 这会导致错误吗?

如果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();
}

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

标准标题可以按任何顺序包含在内; 在给定范围内,每个可以被包括不止一次,与仅被包括一次的效果不同

大多数标头开始是正常的

#ifndef _HEADERFILENAME_H_
#define _HEADERFILENAME_H_

并以以下行结束:

#endif

如果你包括一个标题两次,第二次你的程序将不会再次包含完整的标题,因为#ifndef#ifndef #define#endif

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM