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

时间:2009-11-16 19:01:02

标签: c++ compiler-errors macros header include-guards

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

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

error: expected class-name before ‘{’ token
error: ‘QDesignerFormEditorInterface’ has not been declared

还有其他一些错误。

我实际上是在使用Qt的一个例子,“Custom Widget Plugin Example”。

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

它可能与包含2个包含的文件有关,但这就是示例的实现方式。

2 个答案:

答案 0 :(得分:29)

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

包括警卫目标:

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

错误包括警卫名称(对于文件“config.h”):

  • CONFIG_H
    • 太一般了
  • _CONFIG_HCONFIG__HCONFIG_H____CONFIG_H__
  • PROJECT_CONFIG_H
    • 更好,更不可能在不相关的项目中复制
    • 但仍然没有路径信息,很容易在大型项目中复制

好的包含警卫名称(对于文件“config.h”):

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

答案 1 :(得分:3)

如果为已定义的常量添加#ifndef,它将始终验证为true。你说“文件被声明”,但文件没有被声明。你应该在#ifndef之后放置这个常数。在整个源代码树中进行简单搜索,然后仔细检查当前#define出现的顺序。

当然:你的代码是否正确?尝试将垃圾名称作为常量,并在其后面放置#endif:如果它仍然存在错误,则会出现拼写错误(粘贴代码,如果是这样)。另请参阅this post

PS:我看到David Thornley在评论中输入了类似的建议......对不起,如果这个帖子中有重复的信息。