添加一个包含保护会破坏构建

yan*_*nce 3 c++ macros compiler-errors header include-guards

我将#ifndef ..#define ..#endif添加到我项目的文件中,编译器失败了.一旦我删除它或在定义中添加任何其他名称它编译好.可能是什么问题呢?

听起来像文件已经声明,但我不知道在哪里.我很好,只是删除它,但我真的想知道为什么会发生这种情况.

error: expected class-name before ‘{’ token
error: ‘QDesignerFormEditorInterface’ has not been declared
Run Code Online (Sandbox Code Playgroud)

还有其他一些错误.

我实际上是在使用Qt的一个例子,"Custom Widget Plugin Example".

不同之处在于我使用自己的类作为自定义小部件(.h,.cpp和.ui文件).

它可能与包含2的文件有关,尽管这就是示例的实现方式.

小智 29

这个宏被用作包含守卫吗?如果是这样,听起来你复制了其他地方使用的名称.当人们不考虑包含守卫必须具有的范围时,这是一个常见问题 - 您应该在其中包含比文件名更多的信息.

包括警卫目标:

  • 生成标题时生成一次
  • 再也不用考虑了
  • 重复的机会少于你赢得彩票的机会

错误包括防护名称(对于文件"config.h"):

  • CONFIG_H
    • 太笼统了
  • _CONFIG_H,CONFIG__H,CONFIG_H__,__CONFIG_H__,等.
    • 所有保留,仍然太笼统
  • PROJECT_CONFIG_H
    • 更好,更不可能在不相关的项目中复制
    • 但仍然没有路径信息,容易在大型项目中复制

好包含防护名称(对于文件"config.h"):

  • PATE_20091116_142045
    • 那是 <last name>_<date>_<time>
    • 没有项目,路径,文件名信息甚至需要
    • 容易打字
      • 如果您的编辑器具有插入日期功能,您可以非常快速地"键入"它
    • 容易生成
      • 生成时包含序列号,如果需要每秒生成多个序列号
    • 普遍独特的有力保证
  • INCLUDE_GUARD_726F6B522BAA40A0B7F73C380AD37E6B
    • 从实际的UUID生成
      • 普遍独特的有力保证
    • 如果它出乎意料地出现,"INCLUDE_GUARD"是一个很好的暗示它是什么,同时服务于将它放在一个单独的命名空间(虽然按惯例而不是语言识别)
    • 如果需要,可以预先添加项目名称(宏的项目指南通常需要这样做)
    • 轻松编写自己的示例程序来生成

  • 编译器可以使用包含警卫来做到这一点.海湾合作委员会多年来一直这样做,我听说MSVC现在也这样做了.一个重要的问题是如何处理链接(象征性和硬性)等事情 - #pragma失败,但包括警卫工作. (10认同)
  • #pragma once - 最好的包含守卫(如果您的目标编译器支持) (7认同)
  • 除了#pragma引入了关于支持和非标准的辩论,没有额外的好处.它很容易使用包括警卫. (6认同)