Questions tagged «c++»

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

26
您使用哪些C ++标准库包装函数?
今天早上问的这个问题使我想知道您认为C ++标准库中缺少哪些功能,以及如何通过包装函数来填补空白。例如,我自己的实用程序库具有用于矢量附加的以下功能: template <class T> std::vector<T> & operator += ( std::vector<T> & v1, const std::vector <T> & v2 ) { v1.insert( v1.end(), v2.begin(), v2.end() ); return v1; } 这个用于清除(或多或少)任何类型的类型-对于像std :: stack之类的东西特别有用: template <class C> void Clear( C & c ) { c = C(); } 我还有更多,但是我对您使用的是哪个感兴趣?请限制对包装函数的回答-即最多两行代码。
81 c++ 

6
Bjarne是否对ADL的示例有误,还是我遇到了编译器错误?
我正在阅读有关C ++编程语言的第四版(由Bjarne Stroustrup撰写),参数依赖查找。这是报价(26.3.6,过度攻击性ADL): 依赖参数的查找(通常称为ADL)对于避免冗长非常有用(14.2.4)。例如: #include <iostream> int main() { std::cout << "Hello, world" << endl; // OK because of ADL } 如果没有依赖于参数的查找,endl将找不到操纵器。实际上,编译器会注意到to的第一个参数<<是在中ostream定义的std。因此,它endl在中std查找并找到它(在中<iostream>)。 这是编译器(C ++ 11模式)产生的结果: prog.cpp: In function ‘int main()’: prog.cpp:4:36: error: ‘endl’ was not declared in this scope std::cout << "Hello, world" << endl; ^ 这是编译器还是本书中的错误。标准怎么说? 更新: 我需要澄清一下。我知道正确的答案是使用std::endl。问题是关于书中的文字。正如Lachlan Easton所说,这不仅仅是错字。整个段落(可能)是错误的。如果这本书是由另一位(鲜为人知的)作者撰写的,我可以接受这种错误,但是由于(它仍然是)由Bjarne撰写,所以我一直(并且仍然)对此表示怀疑。

6
枚举常量在C和C ++中的行为不同
为什么这样做: #include <stdio.h> #include <limits.h> #include <inttypes.h> int main() { enum en_e { en_e_foo, en_e_bar = UINT64_MAX, }; enum en_e e = en_e_foo; printf("%zu\n", sizeof en_e_foo); printf("%zu\n", sizeof en_e_bar); printf("%zu\n", sizeof e); } 4 8 8用C和8 8 8C ++(在具有4字节整数的平台上)打印? 我的印象是,UINT64_MAX赋值将强制所有枚举常量至少为64位,但en_e_foo在纯C中仍为32位。 差异的理由是什么?
81 c++  c 


8
在C ++中将int强制转换为枚举的通用方法
有没有投一个通用的方法int,以enum在C++? 如果int落在的范围内,enum则应返回一个enum值,否则抛出exception。有没有办法通用地编写它?不止一个enum type应予以支持。 背景:我有一个外部枚举类型,无法控制源代码。我想将此值存储在数据库中并检索它。
81 c++  casting  enums 

5
最好的(便携式)跨平台任意精度数学库是什么?[关闭]
关闭。此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗?更新问题,使其成为Stack Overflow的主题。 5年前关闭。 改善这个问题 我正在寻找一个使用C或C ++编写的良好的任意精度数学库。您能给我一些建议吗? 主要要求: 它必须处理任意大的整数-我的主要兴趣是整数。如果您不知道任意大这个词的含义,请想象一下类似100000的东西!(阶乘为100000)。 在库初始化或对象创建期间,不必指定精度。精度应仅受系统可用资源的限制。 它应利用平台的全部功能,并应本地处理“小”数字。这意味着在64位平台上,计算(2 ^ 33 + 2 ^ 32)应该使用可用的64位CPU指令。该库不应以与在同一平台上使用(2 ^ 66 + 2 ^ 65)相同的方式来计算该值。 它必须有效地处理加(+),减(-),乘(*),整数除(/),余数(%),幂(**),增量(++),减(--),GCD,阶乘和其他常见的整数算术计算。能够处理不会产生整数结果的函数(例如平方根和对数)是一个加号。处理符号计算的能力甚至更好。 这是我到目前为止发现的内容: Java的BigInteger和BigDecimal类:到目前为止,我一直在使用它们。我已经阅读了源代码,但是我不理解下面的数学原理。它可能基于我从未学过的理论和算法。 内置整数类型或bc,Python,Ruby,Haskell,Lisp,Erlang,OCaml,PHP以及其他一些语言的核心库:我使用了其中一些,但不知道它们使用的是哪个库,或者他们正在使用哪种实现。 我已经知道的: 使用char十进制数字和char*十进制字符串,做用数字计算for-loop。 使用int(或long int或long long)作为基本的“单位”,并使用该类型的数组作为任意长整数,并使用for-loop对元素进行计算。 使用整数类型将十进制数字(或几位数)存储为BCD(二进制编码的十进制)。 布斯的乘法算法。 我不知道的是: 不使用天真的方法,将上述二进制数组以十进制打印。天真的方法的一个示例:(1)从最低到最高的位相加:char*1、2、4、8、16、32 ,……(2)使用上面提到的-string来存储中间十进制结果)。 我的赞赏: 在GMP,MPFR,decNumber(或您认为不错的其他库)上进行了很好的比较。 关于我应该阅读的书籍和文章的好的建议。例如,用数字说明非原始的二进制到十进制转换算法是如何工作的将是很好的。道格拉斯·W·琼斯(Douglas W. Jones)的文章“有限精度的二进制到十进制转换”是一个很好的例子。 任何帮助一般。 如果您认为使用(或或)可以轻松解决此问题,请不要回答此问题。如果您这样认为,则您将不理解所涉及的问题。doublelong doublelong long double
81 c++  c  biginteger  bigdecimal  gmp 

30
是否有任何理由使用C而不是C ++进行嵌入式开发?
题 我的硬件C ++和C89上有两个编译器 我正在考虑将C ++与类一起使用,但不要使用多态性(以避免使用vtables)。我想使用C ++的主要原因是: 我更喜欢使用“内联”函数而不是宏定义。 我想使用名称空间作为前缀,使代码混乱。 我认为C ++的类型更安全,主要是因为模板和冗长的强制转换。 我真的很喜欢重载的函数和构造函数(用于自动转换)。 在为非常有限的硬件(4kb RAM)开发时,您是否看到任何理由坚持使用C89? 结论 感谢您的回答,它们确实很有帮助! 我考虑了这个问题,因此我坚持使用C,主要是因为: 在C语言中预测实际代码会更容易,如果只有4kb的ram,这非常重要。 我的团队主要由C开发人员组成,因此高级C ++功能将不会经常使用。 我找到了一种在C编译器(C89)中内联函数的方法。 您提供了很多好的答案,很难接受一个答案。不幸的是,我无法创建维基并接受它,因此我将选择一个让我思考最多的答案。
81 c++  c  embedded  c89 

6
快速矩形到矩形的交点
测试2个矩形是否相交的快速方法是什么? 在网上搜索时发现了这种单行代码(WOOT!),但我不知道如何用Java脚本编写它,它似乎是用C ++的古老形式编写的。 struct { LONG left; LONG top; LONG right; LONG bottom; } RECT; bool IntersectRect(const RECT * r1, const RECT * r2) { return ! ( r2->left > r1->right || r2->right < r1->left || r2->top > r1->bottom || r2->bottom < r1->top ); }



9
在C ++中对布尔值使用按位运算符
是否有任何理由不对C ++中的“布尔”值使用按位运算符&,|和^? 有时我遇到两种情况,我希望精确地满足两个条件之一(XOR),因此我只是将^运算符放入条件表达式中。有时我还希望评估条件的所有部分,无论结果是否正确(而不是短路),因此我使用&和|。有时我还需要累积布尔值,并且&=和| =可能非常有用。 在执行此操作时,我有些挑剔,但是代码仍然比其他代码有意义且更简洁。有没有理由不将其用于布尔?是否有任何现代编译器为此带来不好的结果?

6
为面向对象的C ++代码开发C包装API
我正在寻求开发一组C API,这些C API将包装我们现有的C ++ API以访问我们的核心逻辑(以面向对象的C ++编写)。本质上,这将是一个胶粘API,它允许我们的C ++逻辑可被其他语言使用。有什么好的教程,书籍或最佳实践介绍围绕面向对象的C ++包装C涉及的概念?
81 c++  c  wrapper 

12
在C / C ++中检测签名溢出
乍一看,这个问题似乎与“如何检测整数溢出”重复出现。,但实际上有很大的不同。 我发现,虽然检测无符号整数溢出非常简单,但是在C / C ++中检测带符号溢出实际上比大多数人想象的要困难。 最明显但最幼稚的方式是: int add(int lhs, int rhs) { int sum = lhs + rhs; if ((lhs >= 0 && sum < rhs) || (lhs < 0 && sum > rhs)) { /* an overflow has occurred */ abort(); } return sum; } 这样做的问题是根据C标准,有符号整数溢出是未定义的行为。 换句话说,根据标准,甚至在导致签名溢出时,程序就如同取消引用空指针一样无效。因此,您不能导致未定义的行为,然后尝试在事后检测溢出,如上述后置条件检查示例中所示。 即使上面的检查可能在许多编译器上都有效,但您不能指望它。实际上,由于C标准说未定义有符号整数溢出,因此某些编译器(如GCC)会在设置优化标志时优化上述检查,因为编译器认为有符号溢出是不可能的。这完全中断了检查溢出的尝试。 因此,另一种检查溢出的可能方法是: …


15
如何将字符串向量内推到字符串中(优雅的方式)
我正在寻找将字符串向量内嵌到字符串中的最优雅方法。以下是我现在使用的解决方案: static std::string& implode(const std::vector<std::string>& elems, char delim, std::string& s) { for (std::vector<std::string>::const_iterator ii = elems.begin(); ii != elems.end(); ++ii) { s += (*ii); if ( ii + 1 != elems.end() ) { s += delim; } } return s; } static std::string implode(const std::vector<std::string>& elems, char delim) { std::string …
81 c++  string  stl  stdstring  implode 

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.