Questions tagged «c++»

C ++是一种通用编程语言。它最初被设计为C的扩展,并且具有类似的语法,但是现在它是一种完全不同的语言。使用此标记可解决有关将要使用C ++编译器编译的代码的问题。对于与特定标准修订版[C ++ 11],[C ++ 14],[C ++ 17]或[C ++ 20]等相关的问题,请使用特定于版本的标记。


8
return语句vs main()中的exit()
我应该使用exit()还是仅使用return语句main()?就我个人而言,我喜欢这些return语句,因为我感觉就像在读取代码时读取任何其他函数和流程控制一样(我认为)。即使我想重构该main()函数,return似乎也比拥有更好的选择exit()。 有exit()没有特别之处return吗?
197 c++  c  coding-style  return  exit 

7
为什么在C ++ 11中使用非成员的begin和end函数?
每个标准容器都有一个beginand end方法,用于返回该容器的迭代器。但是,C ++ 11显然引入了称为std::begin和的自由函数,std::end它们调用begin和end成员函数。所以,不用写 auto i = v.begin(); auto e = v.end(); 你会写 auto i = std::begin(v); auto e = std::end(v); Herb Sutter 在他的写现代C ++的演讲中说,当您想要容器的开始或结束迭代器时,应该始终使用自由函数。但是,他没有详细说明您为什么要这么做。查看代码,可以节省一个字符。因此,就标准容器而言,自由功能似乎完全没有用。赫伯·萨特(Herb Sutter)表示,使用非标准容器也有好处,但是他没有详细介绍。 那么,问题到底是什么做的免费功能的版本std::begin,并std::end做超出调用它们相应的成员函数的版本,你为什么要使用它们?

7
C ++中嵌套类型/类的前向声明
我最近陷入这样的情况: class A { public: typedef struct/class {...} B; ... C::D *someField; } class C { public: typedef struct/class {...} D; ... A::B *someField; } 通常,您可以声明一个类名: class A; 但是您不能向前声明嵌套类型,这会导致编译错误。 class C::D; 有任何想法吗?


30
如何在C ++中的大端值和小端值之间转换?
如何在C ++中的大端值和小端值之间转换? 编辑:为清楚起见,我必须将二进制数据(双精度浮点值以及32位和64位整数)从一种CPU架构转换为另一种。这不涉及网络,因此ntoh()和类似功能在这里不起作用。 编辑#2:我接受的答案直接适用于我要针对的编译器(这就是为什么我选择了它)。但是,这里还有其他非常好的,更便于移植的答案。
196 c++  endianness 

4
C ++标准是否要求iostream的性能较差,或者我只是在处理较差的实现?
每当我提到C ++标准库iostream的性能下降时,我都会感到一阵怀疑。但是,我的探查器结果显示,大量时间花费在iostream库代码(完整的编译器优化)上,从iostream切换到特定于操作系统的I / O API和自定义缓冲区管理确实提高了一个数量级。 C ++标准库正在做什么额外的工作,它是标准所必需的,并且在实践中是否有用?还是某些编译器提供了与手动缓冲区管理竞争的iostream实现? 基准测试 为了使事情顺利进行,我编写了一些简短的程序来练习iostream的内部缓冲: 将二进制数据放入ostringstream http://ideone.com/2PPYw 将二进制数据放入char[]缓冲区http://ideone.com/Ni5ct vector<char>使用http://ideone.com/Mj2Fi将二进制数据放入back_inserter 新功能:vector<char>简单的迭代器http://ideone.com/9iitv 新功能:将二进制数据直接放入stringbuf http://ideone.com/qc9QA 新功能:vector<char>简单的迭代器加边界检查http://ideone.com/YyrKy 请注意,ostringstream和stringbuf版本运行的迭代次数较少,因为它们要慢得多。 在ideone上,其ostringstream速度比std:copy+ back_inserter+ 慢3倍std::vector,比memcpy在原始缓冲区中慢15倍。当我将实际应用程序切换到自定义缓冲时,这感觉与前后分析一致。 这些都是内存中的缓冲区,因此不能将iostream的缓慢归咎于磁盘慢的I / O,过多的刷新,与stdio的同步,或者人们用来掩盖C ++标准库的缓慢的任何其他事情。 iostream。 很高兴看到其他系统上的基准测试以及对常见实现的注释(例如gcc的libc ++,Visual C ++,Intel C ++)以及该标准要求多少开销。 此测试的原理 许多人正确地指出,iostream更常用于格式化输出。但是,它们也是C ++标准提供的唯一用于二进制文件访问的现代API。但是,对内部缓冲进行性能测试的真正原因适用于典型的格式化I / O:如果iostream无法为磁盘控制器提供原始数据,那么当它们负责格式化时又如何保持正常运行呢? 基准时间 所有这些都是外部(k)循环的每次迭代。 在ideone上(gcc-4.3.4,未知的操作系统和硬件): ostringstream:53毫秒 stringbuf:27毫秒 vector<char>和back_inserter:17.6毫秒 vector<char> 普通迭代器:10.6毫秒 vector<char> 迭代器和边界检查:11.4毫秒 char[]:3.7毫秒 在我的笔记本电脑上(Visual C …

2
C中的&&&操作
#include <stdio.h> volatile int i; int main() { int c; for (i = 0; i < 3; i++) { c = i &&& i; printf("%d\n", c); } return 0; } 使用编译的上述程序的输出gcc为 0 1 1 使用-Wall或-Waddress选项,gcc发出警告: warning: the address of ‘i’ will always evaluate as ‘true’ [-Waddress] c在以上程序中如何进行评估?

9
static关键字及其在C ++中的各种用法
关键字static是一个在C ++中具有多种含义的关键字,我感到非常困惑,而且我永远也不会对它的实际工作方式bend之以鼻。 据我了解,存在static存储持续时间,这意味着在全局情况下,它会持续到程序的整个生命周期,但是当您谈论本地时,它意味着默认情况下将其初始化为零。 C ++标准对具有关键字的类数据成员说static: 3.7.1静态存储持续时间[basic.stc.static] 3关键字static可用于声明具有静态存储持续时间的局部变量。 4在类定义中应用于类数据成员的关键字static提供了数据成员静态存储的持续时间。 局部变量是什么意思?那是函数局部变量吗?因为还存在这样的情况,当您声明局部函数时,因为该函数static仅初始化一次,因此它首次进入此函数。 它也只讨论关于类成员的存储时间,那是非实例特定的,那又是一个static否定的属性?还是存储期限? 现在static,文件范围和情况如何?默认情况下,是否所有全局变量都被认为具有静态存储持续时间?以下内容(来自3.7.1节)似乎表明了这一点: 1所有没有动态存储持续时间,没有线程存储持续时间以及非本地变量的变量都具有静态存储持续时间。这些实体的存储应在程序的整个过程中持续(3.6.2、3.6.3) 如何static涉及变量的联动? 整个static关键字令人困惑,有人可以用英语阐明它的不同用法,还能告诉我何时初始化static类成员吗?
195 c++  static 

8
默认情况下,在Visual Studio中从项目中删除安全警告(_CRT_SECURE_NO_WARNINGS)
是否有一种方法可以为所有项目默认设置,以消除使用scanf()之类的函数时出现的预编译器安全警告。我发现您可以通过在项目选项或#define _CRT_SECURE_NO_WARNINGS代码开头添加一行来实现。 我发现自己反复创建新项目来解决编程竞赛,添加以下内容确实很烦人(并且花费了宝贵的时间): #ifdef _MSC_VER #define _CRT_SECURE_NO_WARNINGS #endif 在代码的开头,或者在每次启动新项目时在预编译器选项中进行设置。

17
将C ++定义放在头文件中是一种好习惯吗?
我个人使用C ++的风格总是将类声明放在include文件中,并将定义放在.cpp文件中,这与Loki对C ++头文件代码分离的回答中所规定的非常相似。诚然,我喜欢这种样式的部分原因可能与我过去对Modula-2和Ada进行编码所花费的时间有关,这两种方式在规范文件和主体文件方面都有相似的方案。 我有一个同事,比我更懂C ++,他坚持认为所有C ++声明都应尽可能在头文件中包括这些定义。他并不是说这是一种有效的替代样式,甚至不是一种更好的样式,而是这是每个人现在都在使用C ++的新的普遍接受的样式。 我不像以前那样虚弱,所以我真的不急于爬上他的这个潮流,直到我看到更多的人和他在一起。那么这个成语到底有多普遍? 只是为了给出一些答案的结构:现在是The Way,很常见,有点常见,不常见或被bug淘汰吗?

7
如何打开(字面上)所有GCC警告?
我真的要启用GCC的所有警告。(您会认为这很容易...) 您-Wall可能认为可以解决问题,但不能!还需要-Wextra。 您-Wextra可能认为可以解决问题,但不能!并非所有此处列出的警告(例如-Wshadow)都已启用。而且我仍然不知道这个清单是否全面。 我如何告诉GCC启用(如果不是,则不是,否则为!)所有警告?




By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.