Questions tagged «c++»

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

2
为什么C ++的初始分配比C大得多?
当使用相同的代码时,只需更改编译器(从C编译器到C ++编译器)将更改分配的内存量。我不太确定为什么会这样,并且想进一步了解它。到目前为止,我得到的最好的答复是“可能是I / O流”,它不是很具描述性,使我想知道C ++的“您不用为不使用的东西付钱”。 我正在使用分别为7.0.1-8和8.3.0-6的Clang和GCC编译器。我的系统在最新的Debian 10(Buster)上运行。基准通过Valgrind Massif完成。 #include <stdio.h> int main() { printf("Hello, world!\n"); return 0; } 所使用的代码不会更改,但是无论我是以C还是C ++进行编译,它都会更改Valgrind基准测试的结果。但是,这些值在编译器之间保持一致。该程序的运行时分配(峰值)如下: GCC(C):1,032字节(1 KB) G ++(C ++):73,744字节(〜74 KB) lang(C):1,032字节(1 KB) Clang ++(C ++):73,744字节(〜74 KB) 为了进行编译,我使用以下命令: clang -O3 -o c-clang ./main.c gcc -O3 -o c-gcc ./main.c clang++ -O3 -o cpp-clang ./main.cpp g++ -O3 …
138 c++  c  benchmarking 


13
为什么C ++需要单独的头文件?
我从来没有真正理解过为什么C ++需要一个单独的头文件,其功能与.cpp文件中的功能相同。这使得创建类和重构它们非常困难,并且向项目中添加了不必要的文件。然后就是必须包含头文件,但是必须显式检查它是否已经包含在内的问题。 C ++于1998年获得批准,为什么要这样设计?拥有单独的头文件有什么优点? 后续问题: 当我仅包含.h文件时,编译器如何查找其中包含代码的.cpp文件?它是否假定.cpp文件与.h文件具有相同的名称,或者实际上查看目录树中的所有文件?

6
将静态库链接到其他静态库
我有一小段代码,它依赖于许多静态库(a_1-a_n)。我想将该代码打包在一个静态库中,并提供给其他人。 我的静态库称为X,可以正常编译。 我已经创建了一个简单的示例程序,该示例程序使用了X中的函数,但是当我尝试将其链接到X时,我从库a_1-a_n中收到有关缺少符号的许多错误。 有没有一种方法可以创建一个新的静态库,Y包含X和X所需的所有功能(从a_1-a_n中选择的位),以便我可以仅分发Y以便人们将其程序链接到? 更新: 我看过只是用ar转储所有内容并制作了一个mega-lib,但是最终包含了许多不需要的符号(所有.o文件均为700 MB,但是,静态链接的可执行文件为7 MB)。有没有一种很好的方法可以只包含实际需要的内容? 这看起来与如何将多个C / C ++库合并为一个库密切相关?。
138 c++  linker  ar  .a 


3
如何为Visual Studio 2010构建Qt
我很难找到一种方法,该方法为在V​​isual Studio 2010中使用Qt提供了一个稳定的解决方案,因此在收集了所有信息并进行了一些反复试验之后,我想将解决方案写进指南中。 问题,或者为什么无法使用预构建的二进制文件? 在某些特殊情况下,似乎可以使用为Visual Studio 2008构建的二进制文件,但是我发现它们不起作用。在我的情况下,它们编译正常,但是会产生运行时错误,如下所示: 或从Visual Studio 2010启动时: 更新:我发现了一篇博客文章,分析了为什么它对某些人有用,而对其他人却无效。一句话,这取决于您是否在同一台计算机上安装了Visual Studio 2008。 http://blog.paulnettleship.com/2010/11/11/troubleshooting-visual-studio-2010-and-qt-4-7-integration/ 最重要的事情(我愚蠢地没有意识到)是,如果您没有安装Visual Studio 2008,则无法使用Visual Studio 2008编译的库和dll(可从Qt网页上获得)。原因是因为您下载的Qt SDK是一个调试版本,它依赖于VC9.0 DebugCRT,这意味着它需要安装Visual C ++ 2008 Debug Runtime,该版本无法作为可再发行的安装程序使用。安装DebugCRT的唯一方法是安装整个Visual Studio 2008。

10
如何使用std :: array模拟C数组初始化“ int arr [] = {e1,e2,e3,…}”行为?
(注意:这个问题是关于不必指定元素的数量,而仍然允许嵌套类型直接初始化。) 这个问题讨论了C数组(如)所剩下的用法int arr[20];。@James Kanze 在回答中显示了C数组的最后据点之一,它具有独特的初始化特性: int arr[] = { 1, 3, 3, 7, 0, 4, 2, 0, 3, 1, 4, 1, 5, 9 }; 我们不必指定元素的数量,万岁!现在,使用C ++ 11函数std::begin和std::endfrom <iterator>(或您自己的变体)对其进行迭代,您甚至无需考虑其大小。 现在,是否有任何(可能是TMP)方法可以达到相同目的std::array?允许使用宏使它看起来更好。:) ??? std_array = { "here", "be", "elements" }; 编辑:中级版本,从各种答案编译而成,如下所示: #include <array> #include <utility> template<class T, class... Tail, class Elem = typename …

7
64位Windows上long的位大小是多少?
不久前,有人告诉我long在64位计算机上不是64位,我应该始终使用int。这对我来说没有意义。我已经看到文档(例如Apple官方网站上的文档)说long在为64位CPU进行编译时确实是64位。我查看了64位Windows上的内容,发现 Windows:long并int保持32位长度,并且为64位整数定义了特殊的新数据类型。 (来自http://www.intel.com/cd/ids/developer/asmo-na/eng/197664.htm?page=2) 我应该使用什么?我是否应该在Windows上定义类似(uw,sw((un)signed width))的东西,long否则是否要检查目标CPU的位大小?
137 c++  c  windows  64-bit  porting 

8
无法在VC2010 Express中打开包含文件'afxres.h'
我正在尝试使用VS express 2010编译旧项目,但出现此错误: 致命错误RC1015:无法打开包含文件'afxres.h'。从此代码 ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "afxres.h" 我已经安装了Windows SDK,但没有成功。 谢谢!

6
如何指定指向重载函数的指针?
我想将重载函数传递给std::for_each()算法。例如, class A { void f(char c); void f(int i); void scan(const std::string& s) { std::for_each(s.begin(), s.end(), f); } }; 我希望编译器f()按迭代器类型解析。显然,它(GCC 4.1.2)没有做到这一点。那么,如何指定f()我想要的呢?
137 c++  stl 

5
C ++双地址运算符?(&&)
我正在阅读STL源代码,我不知道&&应该使用哪个地址运算符。这是来自的代码示例stl_vector.h: vector& operator=(vector&& __x) // <-- Note double ampersands here { // NB: DR 675. this->clear(); this->swap(__x); return *this; } “地址地址”有意义吗?为什么它有两个地址运算符而不是一个?

15
在C ++中方便地声明编译时字符串
能够在C ++中的编译期间创建和操作字符串有几个有用的应用程序。尽管可以用C ++创建编译时字符串,但是该过程非常繁琐,因为需要将字符串声明为可变的字符序列,例如 using str = sequence<'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!'>; 诸如字符串连接,子字符串提取等操作很容易实现为对字符序列的操作。是否可以更方便地声明编译时字符串?如果没有,那么作品中是否有建议可以方便地声明编译时字符串? 为什么现有方法失败 理想情况下,我们希望能够声明如下编译时字符串: // Approach 1 using str1 = sequence<"Hello, world!">; 或者,使用用户定义的文字, // Approach 2 constexpr auto str2 = "Hello, world!"_s; 哪里decltype(str2)会有constexpr构造函数。可以利用以下事实来实现方法1的更混乱的版本: template <unsigned Size, const char Array[Size]> struct foo; …



11
测量C ++中函数的执行时间
我想弄清楚某个函数在我的C ++程序中要花多少时间才能在Linux上执行。之后,我想进行速度比较。我看到了几个时间函数,但最终还是从boost中获得了。计时: process_user_cpu_clock, captures user-CPU time spent by the current process 现在,我不清楚是否使用上面的功能,我是否可以获得该功能唯一的CPU使用时间? 其次,我找不到使用上述功能的任何示例。谁能帮我如何使用以上功能? PS:现在,我习惯于std::chrono::system_clock::now()以秒为单位获取时间,但这由于每次CPU负载不同而给我不同的结果。

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.