Теперь я пытаюсь создать библиотеку 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.
Макросы расширяются до namespace std {
и }
соответственно, если код вытягивается через стандартный столбец библиотеки C++. Это заставляет меня думать, что вы не # включая stdlib.h напрямую (что хорошо!).
Более ранние версии libstd C++ вытащили символы из заголовков заголовков C в глобальное пространство имен, даже если использовались C++ версии этих заголовков (например, <cstdlib>
вместо <stdlib.h>
); более новые размещают их только в пространстве имен std.
Самый чистый способ исправить это
#include <cstdlib>
во всех единицах перевода, где возникает проблема, и использовать std::div
вместо div
. Если вы ленитесь, вы также можете
#include <stdlib.h>
во всех единицах перевода, которые используют div
, но смешивание C и C++ всегда нехорошо. Тем не менее, в этом конкретном случае нет.