как включить __BEGIN_NAMESPACE_STD в stdlib.h

0

Теперь я пытаюсь создать библиотеку c++ в linux с cmake. Если я не включил опцию -std = c++ 0x, я всегда получаю error: 'div_t' was not declared in this scope ошибок компиляции error: 'div_t' was not declared in this scope для следующих кодов:

        int xPos;
        div_t divResult;
        divResult = div(xPos,8);

Тогда, если я включу опции -std - c++ 0x с cmake: set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x", тогда все в порядке. Однако в моей библиотеке я не использовал [ CN10] 0x, поэтому я не хочу устанавливать параметр std = c++ 0x. Поэтому я ищу файл заголовка, который определяет div_t, и находит, что он определен в stdlib.h в следующем MACRO:

__BEGIN_NAMESPACE_STD


typedef struct
{ 
  int quot;
  int rem;
} div_t;

....
....
__END_NAMESPACE_STD

Мне кажется, что, если я могу включить эти макросы, я могу построить библиотеку, не включив функцию c++ 0x. Поэтому мой вопрос заключается в том, что я могу сделать в этой ситуации.

Кстати, я могу построить библиотеку очень хорошо, не включив функцию c++ 0x, если в Linux-машине установлен только g++ 4.4. Когда я также устанавливаю g++ 4.6 и делаю g++ 4.6 по умолчанию g++, тогда возникла ошибка компиляции. Даже я изменил значение по умолчанию g++ на g++ 4.4, ошибка компиляции все еще существует, если я не включил функцию c++ 0x.

  • 0
    Возможно, вы могли бы раскрыть, что именно это ошибка компиляции?
  • 0
    @molbdnilo Я добавил ошибку компиляции, как вы предложили.
Показать ещё 3 комментария
Теги:
c++11

1 ответ

2
Лучший ответ

Макросы расширяются до namespace std { и } соответственно, если код вытягивается через стандартный столбец библиотеки C++. Это заставляет меня думать, что вы не # включая stdlib.h напрямую (что хорошо!).

Более ранние версии libstd C++ вытащили символы из заголовков заголовков C в глобальное пространство имен, даже если использовались C++ версии этих заголовков (например, <cstdlib> вместо <stdlib.h>); более новые размещают их только в пространстве имен std.

Самый чистый способ исправить это

#include <cstdlib>

во всех единицах перевода, где возникает проблема, и использовать std::div вместо div. Если вы ленитесь, вы также можете

#include <stdlib.h>

во всех единицах перевода, которые используют div, но смешивание C и C++ всегда нехорошо. Тем не менее, в этом конкретном случае нет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню