【问题标题】:how to enable __BEGIN_NAMESPACE_STD in stdlib.h如何在 stdlib.h 中启用 __BEGIN_NAMESPACE_STD
【发布时间】:2014-11-18 14:59:07
【问题描述】:

我现在正在尝试使用 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 启用 -std-c++0x 选项:set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -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 功能,编译错误仍然存​​在。

【问题讨论】:

  • 或许你可以透露一下这个编译错误到底是什么?
  • @molbdnilo 我按照你的建议添加了编译错误。
  • div_t 应该在 C++03 中可用。 (据我所知,您找到的宏只是用于在应该添加的时候将内容添加到 std 命名空间。)您是 #include <cstdlib> 还是 #include <stdlib.h>
  • @molbdnilo 谢谢,如果我包含 那么编译错误就会消失。
  • @molbdnilo 我没有意识到我没有包含 因为它在 g++4.4 是计算机中安装的唯一编译器时工作。

标签: c++ linux c++11


【解决方案1】:

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

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

解决这个问题的最干净的方法是

#include <cstdlib>

在出现问题的所有翻译单元中使用std::div 而不是div。如果你很懒,你也可以

#include <stdlib.h>

在所有使用 div 的翻译单元中,但混合 C 和 C++ 总是很麻烦。不过,在这种特殊情况下并不可怕。

【讨论】:

    猜你喜欢
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多