草庐IT

C++标准

全部标签

c++ - VC是否符合警告C4407的标准?

以下源代码在VC中生成警告C4407,编译器确实生成了不正确的代码。structA1{inta1;};structA2{inta2;};structB:A1,A2{voidf(){std::cout*pb)();(pA->*pa)();}产生的代码不正确,因为在调用pa时没有调整指针pA,导致中的this指针值错误f。但是,代码在GCC和clang中编译良好,没有任何警告(严格别名除外)。指针pA在GCC和clang生成的代码中进行了适当的调整。所以,我想知道标准对此有何看法?上面代码中的转换是否符合标准?或者它是GCC和clang的非标准扩展? 最佳答案

c++ - C/C++ 不确定值 : Compiler optimization gives different output (example)

C/C++编译器(clang、gcc等)似乎产生了与优化级别相关的不同输出。您也可以查看本文中包含的在线链接。http://cpp.sh/5vrmv(将输出从无更改为-O3以查看差异)。基于下面的一段代码,有人可以解释我的几个问题吗:#include#includeintmain(void){int*p=(int*)malloc(sizeof(int));free(p);int*q=(int*)malloc(sizeof(int));if(p==q){*p=10;*q=14;printf("%d",*p);}return0;}是否确定执行将始终进入if语句?我们如何知道两个指针p和q的

c++ - 如何使用 clang 和选项 -std=c++11 编译项目,使用 autotools

我正在使用C和C++代码开发软件。我最近在c++11标准中添加了一些代码。在configure.ac我写道:forfin'-std=c++11''-std=c++11-stdlib=libc++'doAX_CHECK_COMPILE_FLAG([$f],[CXXFLAGS="$CXXFLAGS$f"stdpass=true],[],[],[])${stdpass-false}&&breakdoneif!"${stdpass-false}";thenAC_MSG_ERROR([UnabletoturnonC++11modewiththiscompiler])fi使用gcc我没问题,一切顺

c++ - 为动态数据结构预分配内存

我有一个问题/好奇心。假设我想实现一个列表,例如我基本上可以使用cormenbook方法。其中解释了如何实现、插入、删除、键搜索等。然而,关于内存使用的内容却一无所获。例如,如果我想在整数列表中插入一个整数。例如,我可以先创建一个节点(我在那里分配内存)插入整数,然后将节点插入列表中。如果我想删除一个整数,一旦我知道存储在哪个节点中,我就必须释放内存。我现在想知道是否可以更方便地预分配内存来存储,比如说,10个节点并保留一个指向要使用的空闲节点的指针。如果内存池已满,那么我会为20个节点重新分配内存,如果内存池很大,我会分配该池大小的一半(依此类推)。池的管理当然更复杂,因为我需要例如

c++ - 具有最新标准支持的 Mingw 构建

是否有支持文件系统命名空间的mingw版本?我正在将项目从vc移动到mingw,并且不想添加boost文件系统,因为目前它在gcc/Linux和vc/win下使用实验命名空间在没有boost的情况下工作。 最佳答案 MinGWGCC8.2.0可以在没有实验命名空间的情况下使用文件系统。虽然它只能通过使用-lstdc++fs与文件系统一起工作(当然应该有-std=c++17编译标志或类似的东西). 关于c++-具有最新标准支持的Mingw构建,我们在StackOverflow上找到一个类似

c++ - LLVM 在运行时获取声明函数的参数值

我正在编写一个LLVMpass,它需要获取传递给声明函数的值并将其打印出来。请注意声明的函数在LLVMIR中被调用。我已经编写了一个模块传递来迭代程序中的所有指令。获取指令中被调用函数参数的片段如下:for(auto&B:F){for(auto&I:B){if(auto*InvokeI=dyn_cast(&I)){if(InvokeI->getCalledFunction()->getName().str()=="function_name"){errs()getOperand(0))getOperand(1))getOperand(2))但是,如果被调用函数的LLVMIR看起来像这样

c++ - 在 C++ 中是否有符合标准的方法来执行零拷贝 IPC?

我有一个应用程序当前从流(套接字、命名、管道、标准输入等)中读取数据到char缓冲区,然后使用reinterpret_cast指向一个Foo*(其中Foo是POD)进入缓冲区的中间,然后通过该指针处理缓冲区的内容。现在,这违反了严格的别名规则,但我怀疑它在实践中是否真的会引起问题。不过,在标准C++中是否有公认的方法来执行此操作?因为我们可能会以这种方式传输数百千兆字节,并且在任何情况下都不想引入将此数据从缓冲区复制到具有memcpy的结构中的开销。为了清楚起见,代码看起来像这样:MessageData*msg=newMessageData();while(ipc.we_have_da

c++ - 仅使用 C++ 中的标准库获取以毫秒为单位的当前日期和时间

我正在尝试打印这样的时间戳。2018-05-24T20:16:07.339271我不想使用Boost或任何第三方库。我只想使用标准库。我使用的是Clang6,因此我应该能够在必要时使用C++17。我开始查看chrono并得到了类似的东西。autonow=std::chrono::high_resolution_clock::now();但是,我不确定如何从上面获取我想要的日期时间格式。 最佳答案 我猜你最好的选择是使用std::localtime+std::put_time 关于c++-

c++ - 将 std::web_view 工具引入标准有什么好处?

根据TheLibraryEvolutionIncubator的最新session,获得大力支持的设施之一是std::web_view。提案在P1108R2中描述并将用于enablesmodern,natural,multimodaluserinteractionbyleveragingexistingwebstandardsandtechnologies.std::web_vieww("web_viewtestapp");w.set_uri_scheme_handler("wv",[&](conststd::string&uri,std::ostream&os){std::cout""

c++ - 无法编译访问另一个 dll 的 dll

所以,我有一个有趣的问题。我正在使用一组专有的dll,显然我没有这些dll的源代码。目标是编写一个中间dll,将来自专有dll的大量函数调用组合在一起。我遇到的问题是,在使用g++进行编译时,原始dll出现如下错误:无法导出libname_NULL_THUNK_DATA。找不到符号。如果我添加一个main并编译成一个可执行文件,一切都会按预期工作。我正在使用mingw进行编译。感谢您的帮助。针对第一个回复:要么我对您所说的内容感到困惑,要么我没有很好地表达我的问题。我并没有明确尝试从我的包装器中导出任何东西,我只是从它们的dll中调用函数。问题是我收到错误,无法将这些特定符号从dll导