如何在stdlib.h中启用__BEGIN_NAMESPACE_STD

时间:2014-11-18 14:59:07

标签: c++ linux c++11

我现在正在尝试使用cmake在linux中构建一个c ++库。如果我没有启用-std = c ++ 0x选项,我总是会得到以下代码的编译错误error: 'div_t' was not declared in this scope

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

然后如果我用cmake:set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x"启用-std-c ++ 0x选项,那么一切都很好。但是,在我的库中我没有使用任何c ++ 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功能。所以我的问题是在这种情况下我能做些什么。

顺便说一下,如果在linux机器上只安装了g ++ 4.4,我可以很好地构建库而不启用c ++ 0x功能。当我还安装g ++ 4.6并使g ++ 4.6成为默认的g ++时,编译错误就开始发生了。即使我将默认的g ++更改为g ++ 4.4,如果我不启用c ++ 0x功能,编译错误仍然存​​在。

1 个答案:

答案 0 :(得分:2)

如果代码是通过C ++标准库头引入的,则宏分别扩展为namespace std {}。这让我相信你不直接#include stdlib.h(这很好!)。

早期版本的libstdc ++将C遗留头中的符号拉入全局命名空间,即使使用了这些头的C ++版本(例如<cstdlib>而不是<stdlib.h>);较新的只将它们放在命名空间std。

解决这个问题的最简单方法是

#include <cstdlib>

在发生问题的所有翻译单元中,并使用std::div代替div。如果你懒惰,你也可以

#include <stdlib.h>

在所有使用div的翻译单元中,但混合C和C ++总是很蹩脚。但是,在这种特殊情况下,并非terribad。