2014-11-16 4 views
0

Эта программа компилируется нормально:Ошибка компиляции при включении усиления/program_options.hpp

#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

+0

@ hosch250 Почему? namespace cio {#include } работает просто отлично, как и следовало ожидать. Программа не скомпилируется до тех пор, пока вы не добавите строку: #include

+1

related: http://stackoverflow.com/questions/12324302/is-it-ok-to-put-a -standard-pure-c-header-include-directive-inside-a-namespace (и многие другие). Короче: не делайте этого. – Rapptz

ответ

0

Просто используйте

#include <cstdio> 

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

Этот заголовок официально обязан объявить все заявления библиотеки C унаследованных внутри пространства имен std.

Однако, если у вас есть «проблема», требующая этих «решений», на самом деле просто пространство имен ваших собственных вещей. Если на самом деле Boost загрязняет глобальное пространство имен, тогда создайте ошибку.

+0

Есть ли версия для ncurses? #include ? –

+0

'ncurses' не является стандартным заголовком, вероятно, будет работать включение в пространство имен. стандарт явно запрещает делать что-либо, прежде чем включать стандартный заголовок, который изменяет его значение. – sp2danny

Смежные вопросы