【问题标题】:Mongoose - error when including standard C++ library filesMongoose - 包含标准 C++ 库文件时出错
【发布时间】:2019-11-23 20:57:39
【问题描述】:

我正在使用 mongoose 在 C++ 中构建 HTTP 服务器,当我尝试在我的程序中包含其他文件时收到一条错误消息:

/Library/Developer/CommandLineTools/usr/include/c++/v1/cstdint:183:8: error: 
  expected unqualified-id
using::intptr_t;
   ^
/Users/cs/Downloads/mongoose-master/mongoose.c:2415:18: note: 
expanded from
  macro 'intptr_t'
#define intptr_t long
             ^

每当我尝试在我的程序中包含以下文件时都会发生这种情况:

#include <string> 
#include <vector>
#include <cstring>
#include <iostream>
#include <iterator>
#include <sstream>

我试图通过注释掉其中一些文件来将其缩小到导致问题的文件之一,但似乎其中任何一个文件都会导致错误。有趣的是,string.h 不会导致错误。

【问题讨论】:

  • 看起来 mongoose 库正在定义一个与标准库中的类型发生冲突的宏。你能举一个简单、完整的例子来显示你的包含顺序吗?一种解决方案可能是重新排序您的包含以将 mongoose.h 放在标准库文件之后,但在这种情况下,宏似乎是在 mongoose.c 中定义的,它应该影响其他翻译单位。
  • @NicholasM 解决了!非常感谢!我认为这与宏冲突有关。
  • 你在任何时候#include-ing mongoose.c 吗?通常不建议对 .c 或 .cpp 文件执行此操作。
  • 是的,我将 .c 和 .h 文件都移到了其他包含语句之后,这使它起作用。包含 .c 文件不是一个好习惯吗?我觉得有必要的原因是它是一个 .c 文件而不是 .cpp,在 g++ 中编译它们感觉很奇怪,但它可以工作。

标签: c++ mongoose network-programming include unqualified-name


【解决方案1】:

听起来您的源代码包含这样的内容:

#include <mongoose.c>

.c 文件定义了一个与标准库头文件中使用的单词发生冲突的宏。

包含 .c 文件不是一个好习惯。相反,您应该构建 mongoose 库,并将您的程序链接到它。

如果您确实必须将所有内容保存在单个翻译单元中,您应该能够将可疑的 include 语句移到所有其他标题之后,甚至移到 cpp 文件的底部。

但最好弄清楚如何单独构建 mongoose.c,然后链接到生成的库。你可以问一个单独的问题,或者看看你是否从中得到了什么:Can't figure out how to build C application after adding Mongoose Embedded

【讨论】:

  • 谢谢。值得庆幸的是,mongoose 库非常简单,您只需要构建 mongoose.c 并包含 mongoose.h。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 2016-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多