3

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

听起来文件已经被声明了,但我不知道在哪里。我可以删除它,但我真的很想知道为什么会这样。

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

还有其他几个错误。

我实际上使用的是 Qt 中的一个示例,“自定义小部件插件示例”。

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

它可能与包含 2 个包含的文件有关,尽管示例就是这样做的。

4

2 回答 2

30

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

包括后卫目标:

  • 在创建标头时生成一次
  • 永远不必再考虑
  • 重复的机会小于你中彩票的机会

错误的包含保护名称(对于文件“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”是一个很好的暗示它是什么,同时将它放在一个单独的命名空间中(尽管按照惯例而不是被语言识别)
    • 如果需要,在前面加上项目名称(宏的项目指南通常要求这样做)
    • 易于编写您自己的示例程序来生成
于 2009-11-16T19:26:04.580 回答
3

如果您#ifndef为已定义的常量添加一个,它将始终验证为真。您说“已声明文件”,但未声明文件。这确实是#ifndef您应该检查的常量。对整个源代码树进行简单搜索,然后仔细检查当前#define出现的顺序。

当然:你的代码正确吗?尝试使用垃圾名称作为常量,并将其放在#endif其后面:如果仍然错误,则说明您有拼写错误(如果有,请粘贴您的代码)。另见这篇文章

PS:我看到 David Thornley 在评论中输入了类似的建议……抱歉,如果这与此线程中的信息重复。

于 2009-11-16T19:10:02.007 回答