Questions tagged «c++»

有关C ++的问题,C ++是一种静态类型,自由格式,多范式,已编译的通用编程语言。

2
将带有指针参数的C ++方法转换为C函数是否可以接受?
我在ESP-32上使用C ++。注册计时器时,我必须这样做: timer_args.callback = reinterpret_cast<esp_timer_cb_t>(&SoundMixer::soundCallback); timer_args.arg = this; 计时器在这里 soundCallback。 注册任务时也是如此: xTaskCreate(reinterpret_cast<TaskFunction_t>(&SoundProviderTask::taskProviderCode), "SProvTask", stackSize, this, 10, &taskHandle); 因此,该方法在单独的任务中启动。 GCC总是警告我这些转换,但它按计划进行。 生产代码中可以接受吗?有一个更好的方法吗?
16 c++  c  functions 

3
什么时候应该在接口中使用string_view?
我正在使用一个内部库,该库旨在模仿拟议的C ++库,并且在过去几年中的某个时候,我看到其接口已从使用更改std::string为string_view。 因此,我忠实地更改了代码,以适应新的界面。不幸的是,我必须传递的是std :: string参数,以及返回的std :: string值。所以我的代码从这样的事情改变了: void one_time_setup(const std::string & p1, int p2) { api_class api; api.setup (p1, special_number_to_string(p2)); } 至 void one_time_setup(const std::string & p1, int p2) { api_class api; const std::string p2_storage(special_number_to_string(p2)); api.setup (string_view(&p1[0], p1.size()), string_view(&p2_storage[0], p2_storage.size())); } 除了更多的代码(可能搞砸了)之外,我真的看不到这种变化给我作为API客户端带来了什么。API调用不太安全(由于API不再拥有其参数的存储空间),可能保存了我的程序0的工作(由于编译器现在可以进行移动优化),即使确实保存了工作,也只能在启动后或在某个地方的大循环中,将不会并且永远不会完成的一些分配。不适用于此API。 但是,这种方法似乎遵循我在其他地方看到的建议,例如,以下答案: 顺便说一句,从C ++ 17开始,您应该避免传递const std :: string&,而推荐使用std :: …

5
C ++中异常的惯用法
isocpp.org例外常见问题解答指出 不要使用throw来指示函数使用中的编码错误。使用断言或其他机制将流程发送到调试器中或使流程崩溃并收集崩溃转储供开发人员调试。 另一方面,标准库定义了std :: logic_error及其所有派生类,在我看来,它们似乎还应该处理编程错误。是否将空字符串传递给std :: stof(将抛出invalid_argument)不是编程错误?是否将包含不同于'1'/'0'字符的字符串传递给std :: bitset(将抛出invalid_argument)不是编程错误?使用无效索引调用std :: bitset :: set(会抛出out_of_range)不是编程错误吗?如果不是,那么将要测试的编程错误是什么?基于字符串的std :: bitset构造函数仅自C ++ 11起存在,因此在设计时应考虑惯用异常。另一方面,有人告诉我,从根本上不应该使用逻辑错误。 经常出现异常的另一个规则是“仅在特殊情况下使用异常”。但是,库函数应该如何知道哪些情况例外?对于某些程序,无法打开文件可能是一种例外。对于其他人,无法分配内存可能不是例外。中间有100多个案例。无法创建套接字?无法连接或将数据写入套接字或文件?无法解析输入?可能是例外,可能不是。该函数本身肯定通常不知道,它不知道在哪种上下文中调用它。 因此,我应该如何决定是否应为特定功能使用异常?在我看来,实际上唯一一致的方法是将其用于所有错误处理,或一无所有。而且,如果我使用的是标准库,那么该选择就是我自己做的。
16 design  c++  exceptions 

5
C ++:类应该拥有还是观察其依赖关系?
说我有一个Foobar使用(取决于)class的类Widget。好的时候,将Widgetwolud声明为中的字段Foobar,或者如果需要多态行为,则可以声明为智能指针,并将其在构造函​​数中初始化: class Foobar { Widget widget; public: Foobar() : widget(blah blah blah) {} // or std::unique_ptr<Widget> widget; public: Foobar() : widget(std::make_unique<Widget>(blah blah blah)) {} (…) }; 而且我们已经准备就绪。不幸的是,今天,Java的孩子们会嘲笑我们一旦看到它,这是理所当然的,因为它的夫妇Foobar和Widget在一起。解决方案看似很简单:应用“依赖注入”以使依赖构造脱离Foobar类。但是,C ++迫使我们考虑依赖关系的所有权。想到三个解决方案: 唯一指针 class Foobar { std::unique_ptr<Widget> widget; public: Foobar(std::unique_ptr<Widget> &&w) : widget(w) {} (…) } Foobar要求将所有权Widget转移给它。这具有以下优点: 对性能的影响可以忽略不计。 它很安全,因为它可以Foobar控制生命周期Widget,因此可以确保Widget它不会突然消失。 它是安全的,Widget不会泄漏,并且在不再需要时会被适当破坏。 但是,这是有代价的: 它对如何使用Widget实例设置了限制,例如,不能使用堆栈分配Widgets,Widget不能共享。 共享指针 class …

6
为什么我们将私有成员函数放在标题中?
为什么我们将私有成员变量放在C ++标头中的答案是,必须在声明实例的位置知道类的大小,以便编译器可以生成可在堆栈中适当移动的代码。 为什么我们需要将私有成员放在标题中? 但是,是否有任何理由在类定义中声明私有函数? 替代方案本质上是pimpl惯用语,但没有多余的间接性。 这种语言的功能不仅仅是历史错误吗?
16 c++  history 

5
“全团队” C ++功能?
在C ++中,异常之类的功能会影响整个程序:您可以在整个程序中禁用它们,或者需要在整个代码中对其进行处理。正如有关C ++ Report的著名 文章所述: 与直觉相反,编码异常的困难部分不是显式的抛出和捕获。使用异常的真正困难部分是编写所有中间代码,以使任意异常可以从其抛出站点传播到其处理程序,安全地到达并且不会破坏程序的其他部分。 由于甚至new抛出异常,因此每个函数都需要提供基本的异常安全性 -除非它仅调用保证不抛出异常的函数- 除非您在整个项目中完全禁用异常。 因此,异常是“整个程序”或“整个团队”的功能,因为使用它们的团队中的每个人都必须理解它们。据我所知,并不是所有的C ++功能都像那样。 一个可能的例子是,如果我没有模板但不使用它们,我仍然可以编写正确的C ++,或者我不会吗?我什至可以调用sort整数数组,并享受其惊人的速度优势。C qsort(因为未调用任何函数指针),而又不会冒bug的风险-是否?看来模板不是“全团队”。 是否还有其他C ++功能会影响代码而不直接使用它们,因此是“整个团队”?我对C中没有的功能特别感兴趣。 更新:我特别要寻找的功能是没有需要您注意的语言标记。我得到的第一个答案是const-正确性,它也是一个完整的团队,因此每个人都需要学习它。但是,AFAICS仅在调用标记为的函数时才会对您产生影响const,并且编译器将阻止您在非const对象上调用它,因此您可以向Google寻求帮助。除非有例外,否则您什至没有得到。而且,它们总是在您使用后立即使用new,因此异常更加“阴险”。但是,由于我不能客观地表述这一点,因此我将不胜感激任何全团队功能。 更新2:我应该写一些类似“ C ++特定功能”的文章,而不是C ++功能,以排除适用于大量主流编程语言的多线程之类的东西。 附录:为什么这个问题是客观的(如果您想知道的话) C ++是一种复杂的语言,因此许多项目或编码指南都试图选择“简单的” C ++功能,并且许多人尝试根据大多数主观标准来包括或排除某些功能。有关此问题,请按此定期关闭。 相反,在上面,我(尽可能精确地)定义了“整体”语言功能是什么,提供了一个示例(例外),以及有关C ++文献的大量支持证据,并要求使用C ++的整体团队功能毫无例外。 您是否应该使用“整个团队”功能,或者是否使用相关概念可能是主观的,但这仅意味着该问题的重要性像往常一样是主观的。

2
对现代C ++范例的最佳概述?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 4年前关闭。 我曾经在8到10年前广泛地编写C ++。从那以后,出于专业原因,我开始使用C#。但是,我有时会看到类似 “如果您仍在手动跟踪指针引用,那么您做错了” 要么 “只要您使用的是RAII之类的现代概念,并且不像正在恢复的C开发人员那样手动分配内存,C ++绝对是安全的。” 两者都是十年前的标准程序。我已经看到,最近C ++有了很大的改进。特别是C ++ 0x似乎具有一些新功能。对于“ C / old C ++”程序员来说,赶上“现代” C ++模式和实践的最佳资源是什么?

8
为什么C ++仍然“混合”
在一个相关的问题上,已经阐明了为什么C ++在许多方面与C不兼容。但是,C ++仍然是“混合” *语言。不幸的是,许多程序员仍然将C ++视为“具有流和内置字符串的C”。这导致了非常糟糕的书面代码,因为它既不是C ++也不是C。恕我直言,如果语言/编译器在某种程度上强迫程序员编写更优雅的代码,那会更好。那么是否有理由保持现代C ++(例如C ++ 0x和将来的版本)混合在一起? *混合是指程序员决定是否使用他/她:标准字符串和流,类,默认名称空间以外的名称空间等。

9
如何有效处理大型Linux / makefile项目?
我从事C ++ Windows应用程序开发已有10年了。最近,我开始研究一些Linux项目,我无法忍受如此无用的工作... 我学习速度很快,并且一段时间以来我一直在使用Linux作为主要平台。而且我对shell,OS原理和GUI感到非常满意。但是当涉及到开发时,感觉就像我回到了学校。 一旦我打开一个更大的项目,我就被卡住了。它们中的大多数都是基于makefile的,因此基本上,当我尝试使用QT或CodeBlocks导航它们时,充其量,我可以基于每个文件使用intellisense。而且大多数时间变量都从作用域泄漏。 然后是一个似乎没有定义的东西,尝试从sourceforge加入一些更大的项目,并且您被困了好几天,因为导航到定义是如此困难…… grep -r "this_def" . --include "*.cpp" --include "*.h"似乎太慢而且笨拙。 然后,调试gdb确实可以工作,但是无论我做什么,似乎WinDbg或VisualStudio调试器都落后了光年。 这些事情使我感到绝望,我想编写代码,但是过程太慢了……我开始认为Linux开发人员会心地学习函数定义并通过眼睛来分析代码,但是我不敢相信所以。 有人经历过这个吗?有什么我想念的东西可以使我更有生产力吗?
16 c++  linux 

8
使用C ++但不使用语言的特定功能时,应该切换到C吗?
在业余时间,我正在开发NES模拟器作为一种爱好。我之所以使用C ++,是因为它是我最常使用,最常了解和最喜欢的语言。 但是,既然我在项目中取得了一些进步,我意识到我几乎没有使用C ++的任何特定功能,并且可以在普通C语言中完成并获得相同的结果。我不使用模板,运算符重载,多态性,继承。那你会说什么 我应该留在C ++还是用C重写? 我不会这样做来获得性能,它可能会产生副作用,但是想法是为什么在不需要C ++时为什么要使用C ++? 我正在使用的C ++的唯一功能是用于封装数据和方法的类,但是可以使用结构和函数来完成,我正在使用new和delete,但也可以使用malloc和free,我仅将继承用于回调,这可以通过指向函数的指针来实现。 请记住,这是一个业余项目,我没有截止日期,因此需要重写的开销时间和工作不是问题,也可能很有趣。那么,问题是C还是C ++?
16 c++  c 

3
从哪里开始学习使用Boost库?
最近,Boost在我正在从事的项目中可用,并且我对此没有太多经验。该库具有很多部分和功能,很难知道从哪里开始学习它-特别是因为我将在编写生产代码时尝试学习它(所以它不会让我太慢)。 如果有人可以列出大约3到5个通常在日常编程中非常有用的功能,并说明它们为何有用,我将不胜感激。然后,我可以开始学习并使用它们了-它至少会让我在图书馆中站稳脚跟,并且是一个开始学习/应用它的友好场所:) 提前致谢!
16 c++  boost 


5
有人可以解释GUI的工作原理以及何时开始使用GUI吗?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我已经学习C ++大约一个月了,在进一步学习之前,我想清除一下我一直遇到的乏味问题。我知道GUI是什么,但是我真的不知道它是如何工作的,也许不是流行的示例? 尽管我知道命令行编程是基本的基础知识,但我认为将GUI摆弄起来还是很有趣的。 尽管我还有大约300万个其他问题,但我会保存下来:D
16 c++  gui 

4
是否在g ++中使用-pedantic标志?
我正在学习C ++,并且正在Linux上使用g ++进行练习。 我想知道从事程序员工作的人们是否使用g ++ -pedantic标志及其在现实世界中的重要性。 那其他编译器又如何呢?这是否已成为事实上的标准? 我很感兴趣,因为我正在阅读C ++ Primer,作者指出在数组定义中使用非常量表达式作为维是非法的,并且默认情况下g ++允许这样做。也许还有其他我不知道的事情。
16 c++  gcc 

4
增强我的C / C ++代码级别
我已经编程3-4年了,觉得不能再被称为初学者了,但是我在该站点上阅读了一些问题,认为他们在谈论WTF?如今,当我拿起编程书籍时,我会有相同的感觉。 我已经阅读了几本入门编程书籍,其中一些涉及C / C ++,另一些涉及游戏。我写了一些更复杂的东西,例如非常基本的AI,串行和TCP / IP接口。 我打算成为一名游戏程序员,但是最近我有机会在嵌入式系统(串行接口)上工作后对嵌入式系统产生了一定的兴趣。 我发现在完成入门和入门书籍之后,很难找到继续学习的材料,因为我找不到任何中级的C ++书籍。 您会提出什么建议来发展和增强我的知识和技能?具体资源将不胜感激。
16 c++  c 

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.