【问题标题】:Compilation error when including boost/program_options.hpp包含 boost/program_options.hpp 时的编译错误
【发布时间】:2014-11-16 06:05:35
【问题描述】:

这个程序编译得很好:

#include <iostream>

#include <stdio.h>

#include <boost/program_options.hpp>

int main(int argc, char* argv[]) {
    std::cout << "Hello world" << std::endl;
}

这个程序给出了一个很长的编译错误:

#include <iostream>

namespace cio {
#include <stdio.h>
}

#include <boost/program_options.hpp>

int main(int argc, char* argv[]) {
    std::cout << "Hello world" << std::endl;
}

编译错误的完整转储:http://codepad.org/aIcQqkgH

我用来编译程序的linux命令是:c++ -o main.cpp.o -c main.cpp

【问题讨论】:

  • @hosch250 为什么? namespace cio { #include } 工作得很好,正如人们所期望的那样。在添加以下行之前,程序不会编译失败:#include
  • 相关:stackoverflow.com/questions/12324302/…(以及许多其他人)。简而言之:不要这样做。

标签: c++ gcc boost


【解决方案1】:

简单使用

#include <cstdio>

http://en.cppreference.com/w/cpp/header/cstdio

这个头文件是正式要求在命名空间std 内声明所有遗留 C 库声明的。

但是,如果您遇到需要这些“解决方案”的“问题”,实际上只需命名您自己的东西即可。如果实际上是 Boost 污染了全局命名空间,那么提交一个 bug。

【讨论】:

  • 是否有适用于 ncurses 的版本? #include ?
  • ncurses 不是标准标头,命名空间中的包含可能会起作用。该标准明确禁止在包含改变其含义的标准标头之前执行任何操作。
猜你喜欢
  • 2012-07-28
  • 2023-01-11
  • 2019-05-23
  • 2010-09-30
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多