我有一些静态库,我不是它的所有者,用旧版本的g ++ 4.3.2编译(c ++ 11/c ++ 0x未激活).
当我使用g ++ 4.6(没有c ++ 11)编译我的代码并使用g ++ 4.6将它与这些静态库链接时,它链接很好,我似乎没有在运行时遇到任何问题(虽然没有测试所有内容).我很想认为前向兼容性还可以.
现在我想用gcc 4.8和c ++ 11编译我的代码,并且仍然将它与那些相同的,而不是重新编译的静态库链接起来.
ABI中的ABI更改只是链接向前兼容性的问题,还是会出现向后兼容性问题?
我正在使用Qt Creator使用C++ 11.
"warning: identifier 'nullptr' is a keyword in C++11 [-Wc++0x-compat]"
"error: 'nullptr' was not declared in this scope"
Run Code Online (Sandbox Code Playgroud)
这是在其他地方工作的代码,相关部分是:
... = nullptr;
Run Code Online (Sandbox Code Playgroud)
可能是什么问题?
这不是一个关键字,它的范围不是全球性的吗?
我下载并构建了gcc 4.6.2.我发现对于C++ 11功能,-std=c++0x仍然需要命令行选项.这是为什么?是不是应该默认支持它?
$ g++ --version
g++ (GCC) 4.6.2
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Run Code Online (Sandbox Code Playgroud) 标准不需要编译器执行返回值优化(RVO),但是从C ++ 11开始,必须移动结果。
看来,这可能会将UB引入到/破坏代码中,这在C ++ 98中是有效的。
例如:
#include <vector>
#include <iostream>
typedef std::vector<int> Vec;
struct Manager{
Vec& vec;
Manager(Vec& vec_): vec(vec_){}
~Manager(){
//vec[0]=42; for UB
vec.at(0)=42;
}
};
Vec create(){
Vec a(1,21);
Manager m(a);
return a;
}
int main(){
std::cout<<create().at(0)<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)
当使用gcc(或与此相关的clang)进行编译时(为了简化示例,-O2 -fno-inline -fno-elide-constructors我正在使用std::vector这些build-option。如果没有这些选项以及手工类和更复杂的create功能,则可能会触发相同的行为)对于C ++ 98(-std=c++98)一切正常:
return a;触发复制构造函数,它保持a原样。m称为(必须在a被销毁之前发生,因为它m是在之后构造的a)。a在析构函数中访问是没有问题的。a函数称为。结果与预期的一样:21已打印(此处为live)。 …
可能重复:
C++ 11中引入了哪些重大变化?
我已经阅读了很多关于C++ 11或C++ 0x的内容,目前我正在开发2个平均大小的项目.
其中一个使用Qt框架,另一个使用Poco.在他们两个中我们都使用GCC默认模式(C++ 03).
我认为Qt和Poco都是用C++ 03规范编写的,但我想知道--std=c++0x在我们的项目中启用并使用没有任何特殊不兼容性的新功能是否可行?
有人有任何实验在C++ 11项目中使用大型C++ 03库(特别是Qt和Poco)并遇到一些问题,如果是,哪些问题?
注意:这不是一个重复的问题.我特地谈到了两个着名的Qt和Poco框架.有人可能会说"根据我的经验,不要使用X类的Qt和C++ 11的这个Y新功能...."
我们正在开发一个用C++开发的模块,但是考虑到新的C++ 11,我正在考虑迁移到那个.
如何进行?两者是相同的还是有一些编译器依赖?
我的软件目前支持Windows和Linux.我正在使用Microsoft Visual Studio以及GCC来构建它.
总的来说,如果有的话需要做哪些改变?
我对学习 C++ 很感兴趣,我找到了一本似乎适合我的书。然而,尽管这本书很新,一些读者批评该书的早期版本并没有真正深入研究新的 C++ 标准(如 C++11、C++14、C++17),而是使用了“旧的 C++ 标准”(即 C++11 之前)。
虽然我检查了新版本是否涵盖了 C++11 等的新方面(似乎涵盖了很多),但我不确定学习 C++11 之前的标准是否效率低下?新版本似乎确实涵盖了新的 C++ 标准(C++11 及更高版本),但我们假设它没有。我获得的知识会过时吗?
同样,我是 C++ 的新手,所以我不确定较新的 C++ 标准是否完全改变了语言,可能会删除/更改我将通过这本书(可能已经过时)学习的语言的(整体)部分。我只是想避免学习不再使用或现在使用方式不同(使用更新的标准)的语言的(整体)部分。但是,如果所有新的 C++ 标准所做的都是添加新功能(但不删除/更改旧功能),我认为从书中学习不会成为问题,因为我可以在之后简单地学习更新的功能。
那么,较新的 C++ 标准在哪些方面改变了语言,您会说从一本可能过时的书中学习是一个问题吗?
在讨论流时,Horstmann的C++陷阱解决了一个有趣的问题.引用他:
使用转换
void*,而不是转换为int或bool实现产生真值的对象.与int或不同bool,void*除了==比较之外没有任何合法的操作.
作为一名程序员,如果void*我期待一个布尔值,我会感到困惑.Horstmann提供了一个使用a void*而不是a bool似乎合适的例子.总是可取的吗?
当我们编程时,C文件扩展名通常以"C"或"CC"或"H"为基础.然后我们迁移到C++并且引入了新的文件扩展名"cpp"和"hpp"虽然"hpp"不常用(或者至少我认为是这样),那么什么是新的C++ 0x文件扩展名或者它们有何不同来自c/c ++文件?
我在Ubuntu QQ上使用CodeLite 5.1.默认情况下,基于之前使用QQ和其他工具安装的内容,我有gtCC和gt ++工具链可用.我总是使用gt ++,这似乎与Boost相处得很好.
想要使用C++ 11运行 - 我需要采取哪些步骤?我需要安装C++ 11库吗?
C++ 11为语言的核心方面带来了新的关键词和新的变化.
那么可以在C++ 11和pre-C++ 11中成功编译同一段代码,但是从每个二进制文件中得到不同的结果吗?通过 pre-C++ 11,我指的是C++ 98,C++ 03或C++ TR1.
我问的原因是因为我有一堆小程序都是用C++编写的.我不知道每个编写的程序都考虑了什么标准.如果它们都在C++ 11和早期标准中编译,那么这些程序的行为是否保证是相同的?我想在C++ 11中编译它们(如果它们可以),但是如果考虑到早期标准,可以避免任何可能导致程序行为不同的细微变化.
非常感谢工作范例.