【问题标题】:Purpose of include guards in .c file在 .c 文件中包含警卫的目的
【发布时间】:2013-11-21 11:29:36
【问题描述】:

我经常在 C 源文件的开头看到这样的代码

#ifndef _INCLUDE_GUARDS_C
#define _INCLUDE_GUARDS_C

main()
{

}

function1()
{
}

#endif

function2()
{
}

我对这样做的目的感到困惑..?

我知道头文件中是否定义了包含保护,但是

  1. 在源文件中包含这些保护的目的是什么?和

  2. 为什么 function2() 在包含保护之外定义?

【问题讨论】:

  • 在源文件(.c)而不是在头文件(.h)中询问这些保护的目的
  • 除了增加您获得 P45 的可能性之外,没有什么可以阻止您包含来自其他源文件的源文件。在这种情况下可以使用多重包含保护。
  • '...一直在看代码'是相当奇怪的序言,不得不说。
  • 问题代码中包含保护似乎没有任何目的......也就是说,它是一个如何以错误方式做事的例子。所以 1. 像这样使用它们没有任何目的,并且 2. 因为示例不是 C 代码应该如何完成的。

标签: c header-files c-preprocessor include-guards


【解决方案1】:

将包含保护放入 C 或 C++ 非头源文件没有任何好处。

我已经从头开始实现了一个预处理器,并尽可能多地研究了包含警卫,这完全没有意义。

至于守卫之外的功能,我觉得很草率。或者,有时当某人有一个魔法咒语时,他们不确定它应该何时应用,所以他们随机应用它。

【讨论】:

  • 我没有实现预处理器,也没有研究过守卫,但我仍然可以告诉你,在源文件中使用守卫是没有意义的(除非你#include'ing那个源文件,在这种情况下我有更强烈的话要说)。
  • @mah 这里似乎没有比权威更好的论据了,没有什么可以将任何答案与评论区分开来。
  • 我并没有对您发布的答案(或者您发布的答案而不是评论)表示任何担忧......相反,我是说在这种情况下,权威并不特别有用.类比双曲线,如果你告诉我从 3 层楼的建筑物中掉下西瓜会导致它在撞击时飞溅,我不需要听到你的物理学学位就可以相信你......我会接受你的话:)
  • @mah 我明白你的意思,但这刚刚是一个不明显的严肃问题,并且有刚刚足够的极端案例和漏洞,这才是真正关心的问题……
【解决方案2】:

老问题,但是...

我认为它可以在测试代码时使用。测试时,您需要访问标头中未定义的本地函数,因此您包含 .c 文件...是的,它很难看。是的,你有better options

对于头文件中未定义的函数,您不需要包含保护。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 2013-02-21
    • 2013-06-22
    相关资源
    最近更新 更多