Questions tagged «c++»

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

4
在C ++ 11中string :: c_str()不再为null终止吗?
在C ++ 11中,basic_string::c_str它定义为与完全相同basic_string::data,而后者又定义为*(begin() + n)与和*(&*begin() + n)(when 0 <= n < size())完全相同。 我找不到任何要求字符串末尾始终包含空字符的内容。 这是否意味着c_str()不再保证会产生以null结尾的字符串?
72 c++  string  c++11 

5
在C / C ++中进行无符号左移之前的掩盖是否过于偏执?
这个问题的动机是由我在C / C ++中实现加密算法(例如SHA-1),编写与平台无关的可移植代码以及彻底避免未定义的行为引起的。 假设标准的加密算法要求您实现此目的: b = (a << 31) & 0xFFFFFFFF 其中a和b是无符号的32位整数。注意,在结果中,我们丢弃了最低有效32位以上的任何位。 作为第一个幼稚的近似值,我们可以假设int在大多数平台上该宽度为32位,因此我们可以这样写: unsigned int a = (...); unsigned int b = a << 31; 我们知道该代码不会在任何地方都起作用,因为int在某些系统上为16位宽,在其他系统上为64位,甚至可能为36位。但是使用stdint.h,我们可以使用以下uint32_t类型来改进此代码: uint32_t a = (...); uint32_t b = a << 31; 这样我们就完成了,对吧?这就是我多年以来的想法。... 不完全的。假设在某个平台上,我们有: // stdint.h typedef unsigned short uint32_t; 在C / C ++中执行算术运算的规则是,如果类型(例如short)比窄int,则将其扩展到int所有值都适合的范围,unsigned int否则。 …


3
添加字符时,编译器停止优化未使用的字符串
我很好奇为什么下面的代码: #include <string> int main() { std::string a = "ABCDEFGHIJKLMNO"; } 当使用编译时,将-O3产生以下代码: main: # @main xor eax, eax ret (我完全理解不需要多余的,a因此编译器可以从生成的代码中完全忽略它) 但是以下程序: #include <string> int main() { std::string a = "ABCDEFGHIJKLMNOP"; // <-- !!! One Extra P } 产量: main: # @main push rbx sub rsp, 48 lea rbx, [rsp + …

5
为什么我不能在一个类中有一个非整数静态const成员?
我注意到C ++不会编译以下内容: class No_Good { static double const d = 1.0; }; 但是,它将很高兴地允许将double更改为int,unsigned或任何整数类型的变体: class Happy_Times { static unsigned const u = 1; }; 我的解决方案是将其更改为: class Now_Good { static double d() { return 1.0; } }; 并认为编译器足够聪明,可以在需要时进行内联...但是这让我感到好奇。 为什么C ++设计人员可以让我将const常量设置为int或unsigned,而不是double? 编辑:我在Windows XP上使用Visual Studio 7.1(.net 2003)。 编辑2: 问题已经回答,但是为了完成,我看到的错误是: error C2864: 'd' : only …
72 c++ 

1
将libstdc ++编译的库与clang ++ -stdlib = libc ++一起使用
我在Mac OS X(10.8.2)下使用C ++进行工作,最近我提出了使用C ++ 11功能的需求,这些功能可以通过使用libc ++ stdlib的clang ++编译器获得。但是,我还需要使用一些针对libstdc ++编译并链接的旧式库(来自MacPorts)。 这样做时,我遇到了链接错误,因为使用(例如)的遗留库的标头std::string需要针对std::__1::basic_string(即libc ++实现std::string)而不是针对std::basic_string实现进行解析。 有没有办法在开发中混合这两个库(例如,通过使用一些预处理器标志?)
72 c++  c++11  clang  libstdc++  libc++ 

8
使用std :: string作为缓冲区有不利之处吗?
我最近看到我的一位同事std::string用作缓冲区: std::string receive_data(const Receiver& receiver) { std::string buff; int size = receiver.size(); if (size > 0) { buff.resize(size); const char* dst_ptr = buff.data(); const char* src_ptr = receiver.data(); memcpy((char*) dst_ptr, src_ptr, size); } return buff; } 我猜这家伙想利用返回字符串的自动销毁功能,因此他不必担心释放分配的缓冲区。 这对我来说有点奇怪,因为根据cplusplus.com,该data()方法返回const char*指向由字符串内部管理的缓冲区的指针: const char* data() const noexcept; Memcpying到一个const char指针?AFAIK只要知道我们所做的事情就不会造成伤害,但是我错过了什么吗?这很危险吗?
72 c++  c++11  stdstring 

6
如何获得GL库/标题?
#include <gl\gl.h> #include <gl\glu.h> #include <gl\glaux.h> 这是一个示例,但是从哪里获取GL标头?
72 c++  opengl 

12
在Windows控制台应用程序中输出unicode字符串
嗨,我试图将unicode字符串输出到具有iostream的控制台,但失败了。 我发现了这一点: 在c ++控制台应用程序中使用unicode字体 ,此代码段有效。 SetConsoleOutputCP(CP_UTF8); wchar_t s[] = L"èéøÞǽлљΣæča"; int bufferSize = WideCharToMultiByte(CP_UTF8, 0, s, -1, NULL, 0, NULL, NULL); char* m = new char[bufferSize]; WideCharToMultiByte(CP_UTF8, 0, s, -1, m, bufferSize, NULL, NULL); wprintf(L"%S", m); 但是,我没有找到任何方法可以使用iostreams正确输出unicode。有什么建议? 这不起作用: SetConsoleOutputCP(CP_UTF8); utf8_locale = locale(old_locale,new boost::program_options::detail::utf8_codecvt_facet()); wcout.imbue(utf8_locale); wcout << L"¡Hola!" << endl; 编辑 …

25
我可以在不使用朋友的情况下从班级外部访问私人成员吗?
免责声明 是的,我完全意识到我的要求完全是愚蠢的,任何想在生产代码中尝试这种事情的人都应该被开除和/或开枪。我主要是看是否可以完成。 既然这已经成为现实,有什么办法可以从类外部访问C ++中的私有类成员?例如,有没有办法用指针偏移量做到这一点? (欢迎使用天真的和其他非生产就绪技术) 更新资料 如评论中所述,我之所以问这个问题,是因为我想写一篇有关过度封装(以及它如何影响TDD)的博客文章。我想看看是否有一种方法可以说“即使在C ++中,使用私有变量也不是100%可靠的强制封装方法”。最后,我决定将重点更多地放在解决问题的方法上,而不是解决问题的原因,因此,我没有像计划中那样突出此处提出的一些内容,但我仍然留下了联系。 无论如何,如果有人对它的发布方式感兴趣,那就是: 测试驱动开发的敌人:第一部分:封装(建议您在决定疯了之前先阅读它)。

8
C ++手册页在哪里?[关闭]
关闭。此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗?更新问题,使其成为Stack Overflow的主题。 3年前关闭。 改善这个问题 Linux中是否存在C ++文档?我想要类似C的手册页的内容。例如,有关string,stl,iostream,ifstream等的文档?

3
静态变量链接错误
我在Mac上编写C ++代码。为什么在编译时出现此错误?: 架构i386的未定义符号:“ Log :: theString”,引用自:libTest.a(Log.o)ld中的Log :: method(std :: string)ld:找不到架构i386铛的符号:错误:链接器命令失败,退出代码为1(使用-v查看调用) 不知道我的代码是否错误,或者我必须向Xcode添加其他标志。我当前的XCode配置是“静态库”项目的默认配置。 我的代码: Log.h ------------ #include <iostream> #include <string> using namespace std; class Log{ public: static void method(string arg); private: static string theString ; }; Log.cpp ---- #include "Log.h" #include <ostream> void Log::method(string arg){ theString = "hola"; cout << theString << …


8
超越-O3 / -Ofast的G ++优化
问题 我们有一个需要优化的中型程序来执行模拟任务。我们已经尽最大努力优化了源代码,以达到编程技能的极限,包括使用Gprof和Valgrind进行性能分析。 最终完成后,我们可能希望在多个系统上运行该程序几个月。因此,我们非常有兴趣将优化推向极限。 所有系统都将在相对较新的硬件(Intel i5或i7)上运行Debian / Linux。 问题 除了-O3 / -Ofast,使用最新版本的g ++可能有哪些优化选项? 我们也对代价高昂的次要优化感兴趣,从长远来看,这将有回报。 我们现在使用的 现在,我们使用以下g ++优化选项: -Ofast:最高“标准”优化级别。所包含的内容-ffast-math在我们的计算中不会造成任何问题,因此尽管不符合标准,我们还是决定使用它。 -march=native:启用所有特定于CPU的指令的使用。 -flto 以便跨不同的编译单元优化链接时间。

25
错误C2065:“ cout”:未声明的标识符
我正在编程任务的“驱动程序”部分工作,并且不断收到这个荒谬的错误: 错误C2065:“ cout”:未声明的标识符 我什至尝试使用std :: cout,但又收到另一个错误消息:IntelliSense:当我声明使用命名空间std时,命名空间“ std”没有成员“ cout” ,包括iostream +我什至尝试使用ostream 我知道这是一个标准的菜鸟问题,但这困扰了我,我是新手(意思是:我之前已经编程过……) #include <iostream> using namespace std; int main () { cout << "hey" << endl; return 0; } 我正在使用Visual Studio 2010并运行Windows7。所有.h文件均具有“ using namespace std”,并包括iostream和ostream。

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.