为什么不包括c中的守卫默认?

为什么不包括c中的守卫默认?,第1张

概述我使用#pragma一次(或者你使用includeguardsàla#ifndef …)基本上在我的c项目的每个头文件中.这是巧合还是你在大多数开源项目中找到的(例如,避免只依赖于个人项目经验的答案).如果是这样,为什么不相反:如果我想要多次包含头文件,我使用相同的特殊预处理器命令,如果不是,我将文件原样保留. C编译器的行为是根据它如何处理每个转换单元来指定的.翻译单元是预处理器在其上运行后的单 我使用#pragma一次(或者你使用includeguardsàla#ifndef …)基本上在我的c项目的每个头文件中.这是巧合还是你在大多数开源项目中找到的(例如,避免只依赖于个人项目经验的答案).如果是这样,为什么不相反:如果我想要多次包含头文件,我使用相同的特殊预处理器命令,如果不是,我将文件原样保留.解决方法 C编译器的行为是根据它如何处理每个转换单元来指定的.翻译单元是预处理器在其上运行后的单个文件.事实上,我们有一个在某些文件中收集声明并将它们称为“头”文件的约定,这对编译器或C标准来说毫无意义.

简单地说,该标准没有提供“头文件”,因此它不能提供自动包含保护头文件.该标准仅提供预处理器指令#include,其余仅仅是约定.没有什么可以阻止你向前声明所有内容并且不使用头文件(除了怜悯任何人应该维护该代码……).

所以头文件不是特别的,没有办法说“这是一个头文件,守护它”,但为什么我们不能保护所有获得#include’d?因为#include比其他语言的模块系统更强大. #include使预处理器粘贴到其他文件中,不一定是头文件.有时,如果在不同文件中的一堆不同命名空间中使用相同的using和typedef声明,这可能很方便.你可以在一个文件中收集它们并在一些地方#include它们.您不希望自动包含防护措施阻止您这样做.

使用#ifndef和#define有条件地包含头也只是惯例.该标准没有“包括警卫”的概念. (然而现代编译器实际上都知道包括警卫.识别包括警卫可以允许更快的编译,但它与正确实现标准无关.)

变得迂腐

该标准确实使用了“header”这个词,特别是在参考C和C标准库时.但是,#include的行为是在§16.2*源文件*包含(emph.mine)下定义的,并且它不对头文件授予任何特殊权限.

努力将适当的模块系统纳入C标准.

总结

以上是内存溢出为你收集整理的为什么不包括c中的守卫默认?全部内容,希望文章能够帮你解决为什么不包括c中的守卫默认?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1241026.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存