我现在正在尝试使用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功能,编译错误仍然存在。
答案 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。