Questions tagged «c++»

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

4
共享库(.so),静态库(.a)和DLL(.so)之间的区别?
我参与了有关Linux库的一些辩论,并想确认一些事情。 根据我的理解(如果我做错了,请纠正我,稍后我将编辑我的文章)在构建应用程序时有两种使用库的方法: 静态库(.a文件):在链接时,会将整个库的副本放入最终应用程序中,以便调用方应用程序始终可以使用库中的功能 共享对象(.so文件):在链接时,仅通过相应的标头(.h)文件针对其API对对象进行了验证。该库直到需要运行时才真正使用。 静态库的明显优点是它们允许整个应用程序独立运行,而动态库的优点是可以替换“ .so”文件(即:由于安全原因需要更新)错误),而无需重新编译基本应用程序。 我听说有人对共享库和动态链接库(DLL)进行了区分,即使它们都是“ .so”文件。在Linux或任何其他POSIX兼容操作系统(即MINIX,UNIX,QNX等)上进行C / C ++开发时,共享库和DLL之间是否有区别?有人告诉我(到目前为止)一个关键的区别是共享对象仅在运行时使用,而DLL的共享必须首先在应用程序中使用dlopen()调用来打开。 最后,我还听到一些开发人员提到“共享档案”,据我了解,共享档案本身也是静态库,但从未被应用程序直接使用。相反,其他静态库将链接到“共享档案”,以将某些(但不是全部)功能/资源从共享档案中拉到正在构建的静态库中。 预先感谢大家的帮助。 更新资料 在向我提供这些术语的上下文中,必须学习Linux的一组Windows开发人员实际上使用了错误的术语。我试图纠正它们,但是(不正确的)语言规范卡住了。 共享库:程序启动时自动链接到程序的库,并且作为独立文件存在。该库在编译时包含在链接列表中(即:LDOPTS+=-lmylib对于名为的库文件mylib.so)。该库必须在编译时以及应用程序启动时存在。 静态库:一个在构建时就合并到实际程序本身的库,用于一个(较大)应用程序,其中包含应用程序代码和在构建程序时自动链接到程序中的库代码,而最终的二进制文件则同时包含这两个程序主程序和库本身作为单个独立的二进制文件存在。该库在编译时包含在链接列表中(即:LDOPTS+=-lmylib对于名为mylib.a的库文件)。该库必须在编译时存在。 DLL:本质上与共享库相同,但不是在编译时包含在链接列表中,而是通过dlopen()/ dlsym()命令加载该库,因此该库无需在构建时就存在,即可进行程序编译。同样,该库不需要在应用程序启动或编译时出现(必需),因为仅在进行dlopen/ dlsym调用时才需要。 共享存档:本质上与静态库相同,但是使用“导出共享”和“ -fPIC”标志进行编译。该库在编译时包含在链接列表中(即:LDOPTS+=-lmylibS对于名为的库文件mylibS.a)。两者之间的区别是,如果共享库或DLL希望将共享归档文件静态链接到其自己的代码,并且能够使共享库中的函数可用于其他程序,而不仅仅是使用它们,则需要使用此附加标志。 DLL内部。当有人为您提供静态库并且您希望将其重新打包为SO时,这很有用。该库必须在编译时存在。 附加更新 “ DLL”和“ shared library” 之间的区别只是我当时工作的公司中的一种(懒惰,不准确的)口语(Windows开发人员被迫转移到Linux开发,并且这个术语陷入了僵局),并遵循上述说明。 另外,在S“共享档案”的情况下,库名后的尾随“ ”文字只是该公司的惯例,而不是整个行业。
272 c++  c  linux  dll  linker 


1
“ int main(){((([](){})());}”如何有效C ++?
最近,我遇到了以下深奥的代码。 int main(){(([](){})());} 重新格式化,如下所示以使其更具可读性: int main(){ (([](){})()); // Um... what?!?! } 但是我无法理解(([](){})())有效代码的有效性。 它看起来不像函数指针语法。 这不可能是操作员重载的把戏。代码按原样编译。 Google在这种全符号搜索中并没有太大帮助。但是它可以在Visual Studio 2010中编译,但不输出任何内容。没有错误,也没有警告。因此,它看起来像有效的代码。 在Javascript和C函数指针之外,我从未见过任何如此奇怪的有效代码。 有人可以解释这是如何有效的C ++吗?
271 c++  c++11  lambda  syntax 



8
如何在C ++中构建图形用户界面?[关闭]
很难说出这里的要求。这个问题是模棱两可,含糊,不完整,过于宽泛或夸张的,因此不能以目前的形式合理地回答。如需帮助澄清此问题以便可以重新打开, 请访问帮助中心。 8年前关闭。 到目前为止,我所有的C ++程序都一直在使用命令行界面,而我所遇到的唯一其他语言是不支持GUI的PHP。 我从哪里开始使用C ++进行图形用户界面编程?如何创建一个?

23
如何获取程序正在运行的目录?
是否有平台无关和文件系统无关的方法来获取使用C / C ++从中运行程序的目录的完整路径?不要与当前工作目录混淆。(除非是标准库,例如clib或STL,否则请不要建议它们。) (如果没有与平台/文件系统无关的方法,那么也欢迎在Windows和Linux中适用于特定文件系统的建议。)
269 c++  c  working-directory 

10
我们应该按引用还是按值传递shared_ptr?
当一个函数接受一个shared_ptr(来自boost或C ++ 11 STL)时,是否要传递它: 通过const参考: void foo(const shared_ptr<T>& p) 或值:void foo(shared_ptr<T> p)? 我更喜欢第一种方法,因为我怀疑它会更快。但这真的值得吗?还是有其他问题? 请问您提供选择的理由,或者如果是这种情况,请说明原因。
269 c++  c++11  boost  shared-ptr 

16
为什么C ++没有垃圾回收器?
首先,因为垃圾收集的优点,所以我没有问这个问题。我提出这个问题的主要原因是,我确实知道Bjarne Stroustrup曾说过C ++将在某个时间点具有垃圾收集器。 话虽如此,为什么不添加呢?已经有一些C ++的垃圾收集器。这仅仅是那些“说起来容易做起来难”的事情之一吗?还是有其他原因未添加(并且不会在C ++ 11中添加)? 交叉链接: C ++垃圾收集器 为了澄清起见,我理解C ++首次创建时没有垃圾收集器的原因。我想知道为什么不能添加收集器。


11
为什么f(i = -1,i = -1)未定义行为?
我正在阅读有关评估违规的顺序,它们举了一个令人困惑的例子。 1)如果相对于同一标量对象上的另一个副作用,未对标量对象上的副作用进行排序,则该行为未定义。 // snip f(i = -1, i = -1); // undefined behavior 在这种情况下,i是标量对象,这显然意味着 算术类型(3.9.1),枚举类型,指针类型,指向成员类型的指针(3.9.2),std :: nullptr_t和这些类型的cv限定版本(3.9.3)统称为标量类型。 在这种情况下,我看不出该陈述的模棱两可。在我看来,无论是第一个还是第二个参数都首先被求值,结果i都为-1,并且两个参数也都是-1。 有人可以澄清一下吗? 更新 我非常感谢所有讨论。到目前为止,我非常喜欢@harmic的答案,因为尽管乍一看看上去很直截了当,但它暴露了定义此语句的陷阱和复杂性。@ acheong87指出了使用引用时出现的一些问题,但我认为这与该问题的无序副作用方面是正交的。 摘要 既然这个问题引起了很多关注,我将总结要点/答案。首先,请允许我指出一下“为什么”可能具有紧密相关但又微妙的不同含义,即“出于何种原因 ”,“出于何种原因 ”和“出于何种目的 ”。我将按照回答“为什么”的含义中的哪一个分组答案。 是什么原因 这里的主要答案来自Paul Draper,Martin J做出了类似但不太广泛的答案。保罗·德雷珀(Paul Draper)的答案归结为 这是未定义的行为,因为未定义行为是什么。 就解释C ++标准所说的内容而言,答案总体来说是非常好的。它还解决了UB的一些相关情况,例如f(++i, ++i);和f(i=1, i=-1);。在第一种相关情况下,不清楚第一个参数是否应为i+1第二个参数,i+2反之亦然;在第二个中,不清楚i函数调用后应为1还是-1。这两种情况都是UB,因为它们属于以下规则: 如果相对于相同标量对象上的另一个副作用,未对标量对象上的副作用进行排序,则该行为未定义。 因此,f(i=-1, i=-1)UB也是如此,因为它属于同一规则,尽管程序员(IMHO)的意图是明显且明确的。 保罗·德雷珀(Paul Draper)在其结论中也明确指出: 可以定义行为吗?是。定义好了吗?没有。 这带给我们一个问题:“由于什么原因/目的f(i=-1, i=-1)留下未定义的行为?” 由于什么原因/目的 尽管C ++标准中存在一些疏漏(可能是粗心大意),但是许多遗漏是有道理的,并且可以满足特定的目的。尽管我知道目的通常是“使编译器-编写器的工作更轻松”或“更快的代码”,但我主要还是想知道是否有充分理由离开 f(i=-1, i=-1) …

14
如何结束C ++代码
如果希望满足特定条件,我希望C ++代码停止运行,但是我不确定该怎么做。因此,只要if语句为真,在任何时候都将终止代码,如下所示: if (x==1) { kill code; }
267 c++ 


30
如何避免“如果”连锁?
假设我有这个伪代码: bool conditionA = executeStepA(); if (conditionA){ bool conditionB = executeStepB(); if (conditionB){ bool conditionC = executeStepC(); if (conditionC){ ... } } } executeThisFunctionInAnyCase(); executeStepX仅当前一个成功时,才应执行功能。无论如何,executeThisFunctionInAnyCase应在最后调用该函数。我是编程的新手,因此对一个基本问题感到抱歉:是否有一种方法(例如,在C / C ++中)避免长if链产生这种“代码金字塔”,而以代码易读性为代价? 我知道,如果我们可以跳过executeThisFunctionInAnyCase函数调用,则代码可以简化为: bool conditionA = executeStepA(); if (!conditionA) return; bool conditionB = executeStepB(); if (!conditionB) return; bool conditionC = executeStepC(); if (!conditionC) return; …

30
如何在C ++中读取和解析CSV文件?
我需要在C ++中加载和使用CSV文件数据。此时,它实际上只能是逗号分隔的解析器(即,不必担心转义新行和逗号)。主要需求是逐行解析器,每次调用该方法时,它将为下一行返回一个向量。 我发现这篇文章看起来很有希望:http : //www.boost.org/doc/libs/1_35_0/libs/spirit/example/fundamental/list_parser.cpp 我从未使用过Boost的Spirit,但愿意尝试。但是只有在没有更直接的解决方案时,我才忽略了这一点。
264 c++  parsing  text  csv 

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.