草庐IT

php - 从 PHP 调用 C/C++ 库函数 - 如何将 -std=c+11 发送到编译器

我正在构建PHP的C++扩展,使用来自thispost的config.m4模板和thisarticle.我需要使用标准的C++11来编译我的类,所以我将EXTRA_FLAGS子句用作:EXTRA_FLAGS="-std=c++11"在我的config.m4中。最终代码:PHP_ARG_ENABLE(vehicles,[Whethertoenablethe"vehicles"extension],[--enable-vehiclesEnable"vehicles"extensionsupport])iftest$PHP_VEHICLES!="no";thenEXTRA_FLAGS="-s

c++ - 由于 C++03/C++11 中指针数组的常量性而导致的链接错误

此问题在-std=c++14之前的g++中可重现。由于以下代码中突出显示的const会生成链接错误。如果删除RHSconst,它就会消失。/*main.cpp*/constchar*constarr[2]={"Hello","World"};//^^^^^intmain(){}和/*foo.cpp*/externconstchar*constarr[2];//^^^^^constchar*foo(){returnarr[0];}编译时:g++[-std=c++11]main.cppfoo.cpp,出现以下链接错误:Infunction`foo()':undefinedreference

c++ - 将 c++98 代码升级到 c++11

我继承了一个庞大的c++代码库,终于可以在64位RedHat7(gcc版本4.8.520150623)上编译和运行它。默认情况下,项目中的makefile是为c++98编译的。我想打开c++11,因为它显然提供了许多语言优势。g++4.8有rathercompletesupport对于C++11。我的问题是:这会带来什么样的风险?我需要注意什么?什么类型的东西可能会破坏(除了不能编译的东西)?我的google-foo在这方面的评分很低,因为我已经搜索过了,但没能找到任何类型的分析。(也许是因为他们真的没有任何风险,我只是不知道。) 最佳答案

c++11 聚合初始化之前的值初始化

我试图理解@bolov对问题Deleteddefaultconstructor.Objectscanstillbecreated...sometimes的第一个接受的答案[1]我好像在那里发现了一个错误,所以它搞砸了整个解释。@bolov解释了为什么这段代码在c++11中成功编译:场景Astructfoo{foo()=delete;};//AllbellowOK(noerrors,nowarnings)foof=foo{};foof={};foof{};//willuseonlythisfromnowon.为什么这段代码无法在C++11中编译:场景Cstructfoo{foo()=de

C++11 正则表达式,非贪婪

我对C++11正则表达式有点问题,我认为它与贪婪有关。这是一个小例子。#include#include#includeintmain(void){std::stringin="{ab}{cd}[ef]{gh}[ij][kl]";//theinput-stringstd::regexrx1("(\\{.+?})(.*)",std::regex::extended);//non-greedy?std::smatchmatch;if(regex_match(in,match,rx1)){printf("\n%s\n",match.str(1).c_str());}return0;}我希望{a

C++14 非聚合的统一初始化

我使用的是VisualC++2013。当类是聚合时,它是零初始化的。当它是非聚合时,它似乎是默认初始化的并且不确定。这是为什么?#includeusingnamespacestd;classTest_1{public:inti;voidf(){};};classTest_2{public:inti;virtualvoidf(){};};intmain(){Test_1t1{};Test_2t2{};cout 最佳答案 如果你的编译器这样做,它就坏了。[dcl.init.list]/p3(所有引用均来自N4140):List-init

c++ - 确保当前线程持有 C++11 互斥锁

有没有办法判断C++11中的当前线程是否持有互斥锁?特别是我想确保类中的某些函数仅在调用线程持有锁时被调用(通过std::lock_guard、std::unique_lock或类似的东西)对于对象,std::mutex是一个成员变量。为了避免在对象被广泛使用时重复锁定和解锁,锁定mutex的责任需要由调用者负责,不能在每个单独的函数中,如果当前当调用这些函数中的任何一个时,线程没有锁定mutex,我想抛出异常。看来我不能只使用std::try_lock然后根据需要进行解锁,因为如果当前线程std::try_lock的行为是未定义的已经持有锁。 最佳答案

C++11 将 shared_ptr 转换为 vector 和类

我正在尝试将转换应用到shared_ptr并存储到shared_ptr,同时还在类中使用函数。我创建了这个例子:#include#include#include#includeusingnamespacestd;classMyClass{public:intfactor=0;MyClass(constintfactor_):factor(factor_){}shared_ptr>mult(shared_ptr>numbers){shared_ptr>result(newvector());transform(numbers->begin(),numbers->end(),result-

c++ - 关于来自 VC12 和 VC14 的 c++ 友元和继承的不同行为

classBase{protected:voidfunc1();};classDerived:publicBase{friendclassThird;};classThird{voidfoo(){Derived;d.func1();}};我可以在VC14(VisualStudio2015)中编译代码而不会出错但从VC12(VisualStudio2013)得到错误cannotaccessprotectedmemberdeclaredinclass'Base'谁是对的?这种具有继承性的友元的正确性是什么?来自MSDNhttps://msdn.microsoft.com/en-us/lib

c++ - c++11中已删除函数的返回类型

在C++11中,我们可以使用delete禁用复制构造函数和赋值运算符:classA{A(constA&)=delete;A&operator=(constA&)=delete;}有一天,我的同事使用void返回类型而不是引用。classA{A(constA&)=delete;voidoperator=(constA&)=delete;}这个也可以吗?例如,如果我有Aa,b,c;a=b=c;这行得通吗? 最佳答案 返回类型不是c++中函数签名的一部分(这也是为什么不能仅通过返回类型重载函数的原因)。所以没关系,因为在名称查找期间仍会找