【问题标题】:c++ file will not compile with a certain #include while all others doc++ 文件不会使用某个#include 编译,而其他所有文件都会编译
【发布时间】:2011-08-10 20:41:49
【问题描述】:

我有一个 c++ 文件,它不断抛出关于链上四个文件的错误,而使用该 #include 的所有其他文件都可以正常编译。

它一直给我这种东西。我确定包含文件没有问题 1. 使用相同文件的所有其他文件都可以正常编译 2. 我查看了该文件,它很好。

/usr/include/opal/opal/mediafmt.h:305:9: error: expected identifier before numeric constant
/usr/include/opal/opal/mediafmt.h:305:9: error: expected ‘}’ before numeric constant
/usr/include/opal/opal/mediafmt.h:305:9: error: expected unqualified-id before numeric constant
/usr/include/opal/opal/mediafmt.h:308:14: error: bit-field ‘mode’ with non-integral type

这很奇怪,因为它在链上抛出了大约 5 个文件的错误:

In file included from /usr/include/opal/opal/connection.h:44:0,
             from /usr/include/opal/opal/call.h:41,
             from /usr/include/opal/opal/manager.h:42,
             from /usr/include/opal/opal/endpoint.h:41,
             from /usr/include/opal/opal/localep.h:41,
             from /home/jonathan/workspace/HHPVideoServer/opal/GstEndPoint.h:12,
             from /home/jonathan/workspace/HHPVideoServer/opal/opal-call-manager.h:42,
             from ../gui/HHPVideoCodecGui.cc:3:

我检查以确保我没有搞砸任何 #define ,但这是我唯一的想法。有人可以向我提供如何跟踪此错误的好方法吗?

这是文件:

http://www.opalvoip.org/docs/opal-v3_9/da/d60/mediafmt_8h-source.html

更新

这是带有来自预处理器的麻烦行的结构。我想“0L”是个问题。

struct H245GenericInfo {
  H245GenericInfo() { memset(this, 0, sizeof(*this)); }
  unsigned ordinal:16;
  enum Modes {
    0L,
    Collapsing,
    NonCollapsing
  } mode:3;
  enum IntegerTypes {
    UnsignedInt,
    Unsigned32,
    BooleanArray
  } integerType:3;
  bool excludeTCS:1;
  bool excludeOLC:1;
  bool excludeReqMode:1;
};

然后

#define None 0L 

from "/usr/include/X11/X.h" 导致 0L 在第 305 行的 Modes 枚举中替换为 None。

来自 X11 库。其他文件正在编译的原因是它们也没有使用 Gtk。有没有人有一个不涉及我重写任何一个 lib 文件的解决方法?

解决方案

我只是把有问题的#include 放在其他一切之上。感谢大家的帮助。

【问题讨论】:

  • 我知道你说文件没问题,但请用它的内容来幽默我们。
  • 在其中一个文件中查找缺少的分号。
  • 对丢失的分号很好的猜测。或者可能缺少右括号。
  • 当然,它确实很长。
  • 第 305 行位于枚举定义的中间。

标签: c++ linux


【解决方案1】:

假设您使用的是 gcc,请运行 gcc -E your-file.c > tmpfile。这仅运行预处理器。输出将非常庞大,但它应该可以帮助您找出问题所在。

第 305 行是什么样的?

编辑: 鉴于您的更新,是的,问题是在您的 mediafmt.h 尝试将其定义为枚举器之前,“无”被定义为宏。您可以在包含 X.h 之后和包含 mediafmt.h 之前添加#undef None 吗? (如果有,请务必发表评论。)

EDIT2:重新排列 #include 指令可能是更好的解决方案 - 但同样,请务必添加注释来解释原因。

【讨论】:

  • 是的,我可以补充。使用#undef 还是重新排列#include 哪个更好?
  • @Jonathan:嗯,有趣的问题。更好的做法是 /usr/include/X11/X.h 不将 None 定义为宏,但我想我们会坚持这一点。我想说重新排列#includes 可能更干净,只要修改后的顺序不会让事情变得太难看。但同样,请务必添加注释来解释它,以免其他人再次出现并重新排列它们。
  • 谢谢!我很高兴遇到了这个问题,因为我学到了一些关于 c/c++ 和 gcc 的知识。
  • @Jonathan:要学习的另一件事是没有称为 c/c++ 的语言。 C 和 C++ 密切相关,但最好将它们视为两种不同的语言。许多编写良好的 C 代码是合法的 C++,但通常不是编写良好的 C++。而且很少有充分的理由编写可以同时编译的代码。 (“c/c++”这个词是我的小忌讳。)
  • 我所说的 c/c++ 并不是说​​它们是同一种语言,我理解它们的区别。当一个原则同时适用于两者时,我会说 c/c++。我对#include order 以及如何阅读预处理器的了解适用于两者。另外,这个代码库是两者之间的集合体。我有 c 和 c++ 代码。此外,我链接到的一些库在 C 中。无论如何,我听到了。
【解决方案2】:

因为您说此包含适用于其他文件,所以我猜测您的#includes 的顺序在失败的文件中可能不同。尝试将 opal-call-manager.h 的 #include 移到文件顶部。

理想情况下,您应该按照其他人发布的答案来追查根本原因,但简单地重新排序 #include 可能是一种快速的解决方案,并且有助于缩小冲突范围。

【讨论】:

  • 谢谢!把它放在文件的顶部,是我需要的最后一个技巧!
【解决方案3】:

由于您发现0L 代替了None,因此您的包含链中的某处可能有#define None 0L。要么像 Klox 建议的那样重新排序包含,所以这个定义发生在 mediafmt.h 被包含之后,或者尝试在其他地方转换、取消定义或修复有问题的 None 定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-05
    • 2019-08-16
    • 2016-09-05
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 2021-12-15
    相关资源
    最近更新 更多