有什么情况你不想要包括警卫吗?

Mep*_*ane 7 c++ include-guards

我知道为什么包含警卫,这#pragma once不是标准的,因此不受所有编译器等的支持.

我的问题是另一种:

有没有明智的理由让它们没有?我还没有遇到这样一种情况,理论上,如果不在其他地方包含文件中提供包含警卫,那将会有任何好处.有没有人有一个例子,没有它们的实际好处?

我问的原因 - 对我来说,他们似乎非常多余,因为你总是使用它们,并且行为#pragma once也可以自动应用于字面上的一切.

sbi*_*sbi 9

我已经看到了根据在包含之前定义的宏生成代码的标头.在这种情况下,它有时希望将这些宏定义为一个(一组)值,包括标题,重新定义宏,并再次包含.
每个看到这种情况的人都同意它是丑陋的并且最好避免,但有时候(如果所述标题中的代码是通过其他方式产生的话),这样做是较小的邪恶.

除此之外,我想不出一个理由.


Mat*_* M. 5

@sbi已经讨论过代码生成,所以让我举个例子.

假设你有很多项的枚举,并且你想为它的每个元素生成一堆函数......

一种解决方案是使用这种多重包含技巧.

// myenumeration.td
MY_ENUMERATION_META_FUNCTION(Item1)
MY_ENUMERATION_META_FUNCTION(Item2)
MY_ENUMERATION_META_FUNCTION(Item3)
MY_ENUMERATION_META_FUNCTION(Item4)
MY_ENUMERATION_META_FUNCTION(Item5)
Run Code Online (Sandbox Code Playgroud)

然后人们就这样使用它:

#define MY_ENUMERATION_META_FUNCTION(Item_) \
  case Item_: return #Item_;

char const* print(MyEnum i)
{
  switch(i) {
    #include "myenumeration.td"
  }

  __unreachable__("print");
  return 0; // to shut up gcc
}

#undef MY_ENUMERATION_META_FUNCTION
Run Code Online (Sandbox Code Playgroud)

这是好还是坏是取决于您,但显然每次在枚举中添加新值时都不必遍历所有实用程序函数.