旧版c ++代码不包含std ::前缀

时间:2017-12-22 14:45:20

标签: c++ gcc g++ iso legacy-code

我正在使用g ++ 4.4.7编译一段非常古老的遗留代码。我真正了解这段代码的原因是它是在Irix / Sun系统上开发的,这意味着它具有MIPS架构。我在使用此代码时发现的一个奇怪的事情是它有时会调用endlset_new_handler之类的函数而不使用std::前缀。显然这会导致编译错误。由于我假设这段代码在某个时间在某台机器上编译,我有点担心盲目添加std::前缀以使其编译,因为它可能会改变行为。

那么,是否有一些旧的非ISO编译器允许这段代码编译?或者是否有某种标志我可以传递给gcc,这将允许这段代码工作?

1 个答案:

答案 0 :(得分:2)

在1998年第一个ISO / IEC标准(通常称为C ++ 98)之前,handleImageChange(event) { event.preventDefault(); let file = event.target.files[0]; reader.onloadend = () => { this.setState({ file, }); } } handleImgSubmit(event){ let file = this.state.file; let reader = new FileReader(); reader.onloadend = () => { this.setState( prevState => { return { imagePreviewUrl: reader.result } }) } reader.readAsDataURL(file) event.preventDefault(); } 命名空间没有引入C ++。在此之前,所有标准库函数和对象都是全局命名空间的一部分。

Herb Sutter在2000年写了一篇名为Migrating to Namespaces的文章,详细说明了他关于过渡的建议。

我不知道有任何编译器标志会将std命名空间折叠到全局命名空间中,无论如何它都是一个坏主意 - std 更大今天比起首次推出时,名称冲突几乎可以肯定。见Why is “using namespace std” considered bad practice?

您不太可能与1998年之前作为标准库一部分的名称发生冲突,因此安全地将这些名称单独提取到全局名称空间中。如果您使用的是预编译头文件,则可以在包含定义符号的标准头文件并以静默方式修复整个项目之后将std指令放在其中。只需为您遇到的每个编译器错误添加一行。

using

如果您的目标是尽可能少的时间和精力使代码正常运行,我只会建议您这样做。更好的长期解决方案仍然是将using std::endl; using std::set_new_handler; 放在库中所有名称的前面。