Questions tagged «c++»

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

12
为什么可变长度数组不是C ++标准的一部分?
在过去的几年中,我很少使用C。今天,当我阅读此问题时,遇到了一些我不熟悉的C语法。 显然,在C99中,以下语法有效: void foo(int n) { int values[n]; //Declare a variable length array } 这似乎是一个非常有用的功能。是否曾有关于将其添加到C ++标准的讨论,如果是,为什么将其省略? 一些潜在的原因: 编译器厂商难以实施 与标准的其他部分不兼容 可以使用其他C ++结构来模拟功能 C ++标准声明数组大小必须是一个常量表达式(8.3.4.1)。 是的,我当然知道在玩具示例中可以使用std::vector<int> values(m);,但这会从堆而不是堆栈中分配内存。如果我想要像这样的多维数组: void foo(int x, int y, int z) { int values[x][y][z]; // Declare a variable length array } 该vector版本变得很笨拙: void foo(int x, int y, int z) …

15
将2D数组传递给C ++函数
我有一个函数,希望将可变大小的2D数组作为参数。 到目前为止,我有这个: void myFunction(double** myArray){ myArray[x][y] = 5; etc... } 我在代码的其他地方声明了一个数组: double anArray[10][10]; 但是,打电话myFunction(anArray)给我一个错误。 传递数组时,我不想复制该数组。对数组所做的任何更改myFunction都应更改的状态anArray。如果我理解正确,我只想将指向2D数组的指针作为参数传递。该函数还需要接受不同大小的数组。因此,例如[10][10]和[5][5]。我怎样才能做到这一点?

30
无循环或有条件打印1至1000
已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 任务:打印从1到1000的数字,而不使用任何循环或条件语句。不要只写printf()or cout语句1000次。 您将如何使用C或C ++做到这一点?
323 c++  c  printf 

4
在英特尔Sandybridge系列CPU中取消对管道程序的优化
我已经花了一个星期的时间来尝试完成这项任务,我希望这里的人可以带领我走上正确的道路。让我从讲师的指示开始: 您的分配与我们的第一个实验分配相反,后者是优化素数程序。您在此作业中的目的是简化程序,即使其运行缓慢。这两个都是占用大量CPU的程序。他们需要几秒钟才能在我们的实验室PC上运行。您可能无法更改算法。 要优化程序,请使用有关Intel i7管道运行方式的知识。想像一下重新排序指令路径以引入WAR,RAW和其他危险的方法。想办法最大限度地减少缓存的有效性。令人作呕的无能。 作业中选择了磨刀石或蒙特卡洛程序。缓存效率注释大部分仅适用于Whetstone,但我选择了蒙特卡洛模拟程序: // Un-modified baseline for pessimization, as given in the assignment #include <algorithm> // Needed for the "max" function #include <cmath> #include <iostream> // A simple implementation of the Box-Muller algorithm, used to generate // gaussian random numbers - necessary for the Monte Carlo method below …

8
C ++ 11基于反向范围的for循环
是否有一个容器适配器可以颠倒迭代器的方向,以便我可以使用基于范围的for循环反向迭代容器? 使用显式迭代器,我可以将其转换为: for (auto i = c.begin(); i != c.end(); ++i) { ... 到这个: for (auto i = c.rbegin(); i != c.rend(); ++i) { ... 我想将其转换为: for (auto& i: c) { ... 对此: for (auto& i: std::magic_reverse_adapter(c)) { ... 有这样的事情还是我必须自己写?
321 c++  c++11  ranged-loops 

23
在单行if或loop中使用大括号(即{})的目的是什么?
我正在阅读我的C ++讲师的一些讲义,他写了以下内容: 使用缩进//确定 从不依赖运算符优先级-始终使用括号//确定 始终使用{}块-即使仅一行// 也不行,为什么? 比较左侧的常量对象//确定 使用unsigned表示> = 0 //好的技巧 删除后将Pointer设置为NULL-双重删除保护//不错 第三种技术对我来说还不清楚:将一行放置在a中会得到{ ... }什么? 例如,使用以下奇怪的代码: int j = 0; for (int i = 0 ; i < 100 ; ++i) { if (i % 2 == 0) { j++; } } 并替换为: int j = 0; for (int i …

4
结合C ++和C-#ifdef __cplusplus如何工作?
我正在一个有很多遗留C代码的项目中。我们也开始使用C ++进行编写,以期最终也转换旧代码。我对C和C ++的交互方式有些困惑。我了解到,用C ++编译器包装C代码extern "C"不会破坏C代码的名称,但是我不确定如何实现这一点。 因此,在每个C头文件的顶部(在包含保护之后),我们有 #ifdef __cplusplus extern "C" { #endif 在底部,我们写 #ifdef __cplusplus } #endif 在这两者之间,我们拥有所有的include,typedef和函数原型。我有几个问题,看我是否正确理解: 如果我有一个C ++文件A.hh,其中包括一个C头文件Bh,包括另一个C头文件Ch,那么该如何工作?我认为,当编译器进入Bh时, __cplusplus将被定义,因此它将包装代码extern "C" (并且__cplusplus不会在此块内定义)。因此,当它进入Ch时, __cplusplus将不会被定义,并且代码也不会被包装在中 extern "C"。它是否正确? 将一段代码包装起来有什么问题 extern "C" { extern "C" { .. } }吗?第二个extern "C" 怎么办? 我们不会在.c文件中放这个包装器,而在.h文件中放。那么,如果一个函数没有原型怎么办?编译器是否认为这是C ++函数? 我们还使用了一些用C编写的第三方代码,并且这些代码没有这种包装。每当我包含该库中的标头时,我都会extern "C"在#include中放一个。这是解决这个问题的正确方法吗? 最后,这是一个好主意吗?还有什么我们应该做的?在可预见的将来,我们将混合使用C和C ++,我想确保我们涵盖了所有基础知识。

30
使C ++程序崩溃的最简单方法是什么?
我正在尝试制作一个与其他崩溃进程连接的Python程序(这在我手中)。不幸的是,我正在连接的程序甚至无法可靠地崩溃!因此,我想制作一个有意崩溃的快速C ++程序,但实际上我不知道这样做的最好和最短的方法,有人知道我该怎么做吗? int main() { crashyCodeGoesHere(); } 使我的C ++程序可靠地崩溃
318 c++  crash 

13
您是否(确实)编写了异常安全代码?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 异常处理(EH)似乎是当前的标准,并且通过搜索Web,我找不到任何尝试改进或替换它的新颖想法或方法(当然,存在一些变体,但没有新颖之处)。 尽管大多数人似乎忽略了它或只是接受了它,但是EH 有一些巨大的缺点:异常对于代码是不可见的,并且它创建了许多可能的退出点。关于软件的Joel撰写了一篇有关它的文章。比较goto合适,让我重新考虑了EH。 我尽量避免使用EH,而只使用返回值,回调或适合目的的任何方法。但是,当您不得不编写可靠的代码时,这些天就不能忽略EH:它以开头new,可能会引发异常,而不是像过去那样仅返回0。这使得任何一行C ++代码都容易受到异常的影响。然后,C ++基本代码中的更多地方会引发异常……std lib会这样做,依此类推。 感觉就像在摇摇欲坠的地面上行走 ..因此,现在我们被迫注意例外! 但是它很难,真的很难。您必须学习编写异常安全代码,即使您有一定的经验,仍然需要仔细检查任何一行代码以确保安全!或者,您开始在各处放置try / catch块,这会使代码混乱,直到达到无法读取的状态为止。 EH替换了旧的干净确定性方法(返回值..),该方法仅具有一些但可以理解且易于解决的缺点,但该方法会在代码中创建许多可能的退出点,并且如果您开始编写捕获异常的代码(您会被迫在某个时候执行),然后它甚至会在您的代码中创建大量路径(catch块中的代码,考虑一个服务器程序,在该服务器程序中您需要除std :: cerr之外的其他日志记录功能。)。EH有优势,但这不是重点。 我的实际问题: 您是否真的编写异常安全代码? 您确定最后一个“生产就绪”代码是异常安全的吗? 您甚至可以确定是吗? 您知道和/或实际使用可行的替代方法吗?


14
#pragma是否曾经是安全的门卫?
我已经读到有一些使用时的编译器优化#pragma once可以导致更快的编译。我认识到这是非标准的,因此可能引起跨平台兼容性问题。 非Windows平台(gcc)上的大多数现代编译器都支持这种功能吗? 我想避免平台编译问题,但也想避免后备防护的额外工作: #pragma once #ifndef HEADER_H #define HEADER_H ... #endif // HEADER_H 我应该担心吗?我是否应该为此花费更多的精力?

11
按降序对向量排序
我应该使用 std::sort(numbers.begin(), numbers.end(), std::greater<int>()); 要么 std::sort(numbers.rbegin(), numbers.rend()); // note: reverse iterators 按降序对向量排序?一种方法或另一种方法有什么优点或缺点?
310 c++  sorting  stl  vector  iterator 

8
如何实现STL样式的迭代器并避免常见的陷阱?
我制作了一个集合,希望为其提供STL样式的随机访问迭代器。我在寻找迭代器的示例实现,但没有找到任何实现。我知道需要对const重载[]和*运算符。将迭代器设为“ STL样式”的要求是什么?还要避免其他陷阱(如果有)? 其他上下文:这是针对库的,除非真正需要,否则我不想引入任何依赖关系。我编写了自己的集合,以便能够使用相同的编译器在C ++ 03和C ++ 11之间提供二进制兼容性(因此不会破坏STL)。



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.