当我6-7年前第一次学习C++时,我学到的基本上是"C with Classes".std::vector
绝对是一个高级话题,如果你真的想要,你可以学到一些东西.当然没有人告诉我可以利用析构函数来帮助管理记忆.今天,我看到的每个地方都看到RAII和SFINAE,STL和Boost以及现代C++.即使是刚刚开始使用该语言的人,也几乎从第1天开始就教授这些概念.
我的问题是,这只是因为我只看到"最好的",即SO上的问题,以及其他倾向于吸引初学者(gamedev.net)的编程网站,或者这实际上代表了C++社区作为一个整体?
现代C++真的成为默认的吗?专家们写的不是一些奇特的东西,而是变成"C++的方式"吗?或者我只是无法看到仍然学习"C with classes"并编写自己的动态数组而不是使用的数千人std::vector
,并通过从他们的顶级代码手动调用new/delete来进行内存管理?
尽管我想要相信它,但如果整个C++社区在几年内发展得如此之多,那似乎令人难以置信.您的经历和印象是什么?
(免责声明:不熟悉C++的人可能会错误地解释标题,因为询问C++是否比其他语言更受欢迎.这不是我的问题."现代C++"是C++中方言或编程风格的通用名称,以该书命名" 现代C++设计:通用编程和设计模式应用 ",我只对这与"旧C++"感兴趣.所以不需要告诉我C++的时间已经过去,我们都应该使用Python;))
我需要连接两个这样的const字符:
const char *one = "Hello ";
const char *two = "World";
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?
我char*
从带有C接口的第三方库中传递了这些,所以我不能简单地使用它std::string
.
我的一个朋友前几天问我,如果我在编程时只是查看数字列表,或者它是如何工作的.我试着解释一下,它通常更像是数学公式,奇怪的英语单词被抛入,并且它通常大部分都是可读的.但这是一个非常模糊的解释,并没有真正解释给非程序员.
但它让我思考什么会成为一个好榜样.不是因为我想教她的编程或任何东西,而只是让她知道什么程序代码"看起来像".
这让我想知道实际上会有什么作为一个好例子.事实证明这非常困难.
我的第一个想法显然是一个简单的"Hello World"计划.但它确实没有显示任何有用的东西.它并没有真正展示我们如何使用函数或变量,或控制流程结构,if
或者while
使程序实际执行某些操作.这没有逻辑.该程序对任何事情都没有反应.
所以像计算素数这样的东西可能是一个更好的例子.但话又说回来,这可能过于理论化和不切实际......(这有什么用呢?它与编写"真实"程序有什么关系?)而且,其中没有重要的控制流逻辑.这只是一个直接的数学序列.
还有,应该使用哪种语言?
理想情况下,我不认为它必须是一种非常"干净"的语言.但相反,它应该可以使结构清晰.如果它这样做,那么一定量的噪音和杂乱可能没问题.也许像C++这样的东西实际上是比Python更好的例子.显式花括号和类型说明符是明显的"钩子",可以帮助解释程序的结构,或者强调它不仅仅是简单的语句,几乎可以读作英语.
但是使用C++,我们也会遇到一些彻头彻尾的奇怪语法.为什么std::cout << x
习惯打印x?为什么不用"普通"函数调用语法?并printf
没有更好的,它具有神秘的格式字符串,并且缺乏可扩展性(我是否想通过使用char*
字符串使程序复杂化?或者我是否使用std::string
并解决这个看似不必要s.c_str()
的字符串可以打印出来的字符串?printf
?
也许更高层次的语言会更好.但是哪一个?为什么?
我知道这里有很多类似的问题,用于教授编程的语言/示例程序.但我认为这里的要求是不同的.在教授编程时,我们比任何事情都更简单.我们希望避免任何尚未教授的内容.我们希望确保学生能够理解屏幕上的所有内容.
我对简单本身并不感兴趣.而是给"外人"一个"程序看起来像什么"的想法.程序并不简单.但他们也普遍表现出一定的结构和方法可以解决这一难题.哪种语言/程序最能突出?
编辑
感谢您到目前为止的所有建议.你们中的一些人对它的看法与我想要的有些不同.
也许一个例子是有序的.我无法驾驶飞机,但我已经基本了解驾驶舱的样子,以及驾驶员在飞行时"做什么".
而且我不是一个训练有素的木匠,但是当我看到一个时,我知道一把锯子或一把锤子.
但是当你看到与电影中的编程有关时,它通常只是充满垃圾的屏幕(如矩阵中的绿色文本).它看起来不像普通人类实际上可以做的事情.它没有什么可辨认的.不是程序员的人只是认为这是黑魔法.
我不想教她飞行,也不想编程软件.但我想给她一个基本的参考框架.只是一个想法"啊,这就是你正在使用的东西.所以它不仅仅是屏幕上的随机符号和数字".if
与矩阵式随机符号和数字相比,即使只显示一个简单的陈述也是一种启示.
你们有些人建议解释一个算法,或使用伪代码,但这就是我想要避免的.我想要的东西只是简单地显示实际的代码是什么样的,就像你不必是一个木匠来看一看锯,并基本了解它是什么以及它是如何工作的.
当我还是个孩子的时候,我们曾经去过意大利度假.在下来的路上,飞行员让我进入飞机的驾驶舱.当然,我没有学习如何驾驶飞机.但我确实看到了飞行员的世界.我知道他们如何让飞机走了,飞行员实际上做了什么.
这就是我想做的一切.我的朋友没有兴趣学习编程,我也不想强迫她理解源代码.但她很好奇我与哪种工具或实体合作.矩阵式符号是否在屏幕上滚动?纯数学?散文形式的英语?
我有兴趣传达的是对"工作时的样子"的高层次理解.
我目前正在开发一个使用C++的无线网络应用程序,它正处于一个我想要在一个进程中使用多线程软件而不是将它们全部放在不同进程中的程度.从理论上讲,我理解多线程,但我还没有实际潜入.
在C++中编写多线程代码时,每个程序员应该知道什么?
在动态类型语言(如JavaScript或PHP)中,我经常执行以下功能:
function getSomething(name) {
if (content_[name]) return content_[name];
return null; // doesn't exist
}
Run Code Online (Sandbox Code Playgroud)
我返回一个对象,如果它存在或null
不存在.
使用引用的C++中的等价物是什么?一般有推荐的模式吗?我看到一些框架有一个isNull()
用于此目的的方法:
SomeResource SomeClass::getSomething(std::string name) {
if (content_.find(name) != content_.end()) return content_[name];
SomeResource output; // Create a "null" resource
return output;
}
Run Code Online (Sandbox Code Playgroud)
然后调用者将检查资源:
SomeResource r = obj.getSomething("something");
if (!r.isNull()) {
// OK
} else {
// NOT OK
}
Run Code Online (Sandbox Code Playgroud)
然而,必须为每个类实现这种魔术方法似乎很重.当对象的内部状态应该从"null"设置为"not null"时,似乎并不明显.
这种模式还有其他选择吗?我已经知道它可以使用指针完成,但我想知道如何/如果它可以用引用完成.或者我应该放弃在C++中返回"null"对象并使用一些特定于C++的模式?任何有关正确方法的建议都将受到赞赏.
Microsoft提供了InterlockedCompareExchange
执行原子比较和交换操作的功能.还有一个内在的._InterlockedCompareExchange
在x86上,这些是使用lock cmpxchg
指令实现的.
但是,通过阅读这三种方法的文档,他们似乎并不同意对齐要求.
英特尔的参考手册没有说明对齐(除了如果启用了对齐检查并且进行了未对齐的内存引用,则会生成异常)
我也查找了lock
前缀,具体说明了这一点
锁定前缀的完整性不会受到内存领域的对齐方式.
(强调我的)
所以英特尔似乎认为对齐是无关紧要的.无论如何,这个操作都是原子的.
该_InterlockedCompareExchange
固有的文档也只字未提对齐,但是InterlockedCompareExchange
功能指出,
该函数的参数必须在32位边界上对齐; 否则,该函数将在多处理器x86系统和任何非x86系统上表现不可预测.
什么给出了什么?对齐要求是否InterlockedCompareExchange
只是为了确保该功能即使在cmpxchg
指令不可用的486之前的CPU上也能正常工作?这看起来很可能基于上述信息,但在依赖它之前我想确定一下.:)
或者ISA需要对齐以保证原子性,我只是在英特尔的参考手册中找错了地方?
我有一个可以在32位机器上编译和工作的软件包.我现在正试图让它在64位机器上编译并发现以下错误 -
error: cast from ‘void*’ to ‘int’ loses precision
Run Code Online (Sandbox Code Playgroud)
是否有编译器标志来抑制这些错误?或者我是否必须手动编辑这些文件以避免这些演员表?
为什么背景颜色不显示为黑色?我不能设置宽度和浮动,没有它们可能吗?
感谢您的时间.
我最近发现了一些代码,其中extern"C"也被添加到源文件中以用于函数.它们也被添加到声明它们的头文件中.
我假设在头文件中添加'extern"C"就足够了.
应该在哪里添加extern"C"块?
更新:假设我正在使用CPP编译器编译我的C代码,并为头文件中的所有函数添加了外部"C"防护(即我的所有函数都在头文件中有原型),但在源文件中我没有添加相同的.这会导致问题吗?
c++ ×6
c ×3
32bit-64bit ×1
atomic ×1
css ×1
interlocked ×1
linux ×1
methods ×1
null ×1
object ×1
portability ×1
winapi ×1
x86 ×1