草庐IT

c++ - 在 C++ 中自初始化为 nullptr 的普通原始指针

我喜欢C++11中的新指针类型,但有时我仍然需要原始指针。然而,让我对C++中的“原始”类型越来越难过的是,它们习惯于在未给出显式值时初始化为未定义。随着我更频繁地使用std::shared_ptr等,将原始指针初始化为null的需要感觉越来越脆弱和不必要。我在说:classfoo{...std::shared_ptrpb;//Initiallynullinwhateverconstructor.std::unique_ptrpd;//Likewise.std::weak_ptrpg;//Andagain.lar*pr;//Uh-oh!Whoknowswhatthisis?Better

c++ - 为什么 Visual Studio 不在 self 赋值时发出警告 (int foo = foo;)

我在重构一个出现了无数次的术语时不小心产生了如下代码中的情况:#include"stdafx.h"#includeintfoo=foo;//Byreplacingwiththefollowinginstructionwecausesacompileerror//intfoo(foo);int_tmain(intargc,_TCHAR*argv[]){intbar=bar;std::cout对于不同的调试和发布配置,编译器对intfoo=foo;保持沉默。我看不出这种说法不是等待发生的错误。VisualStudio编译器不应该发出警告吗?我并不是假装这是未定义的行为。我的意思是,默认情况

c++ - 默认模板类参数混淆了 g++?

昨天我遇到了一个g++(3.4.6)编译器问题,我使用Intel(9.0)编译器编译的代码没有问题。这是显示所发生情况的代码片段:templateclassFoo{};structBar{voidmethod(Fooconst&stuff=Foo());};g++编译器错误是:foo.cpp:5:error:expected`,'or`...'before'>'tokenfoo.cpp:5:error:wrongnumberoftemplatearguments(1,shouldbe2)foo.cpp:2:error:providedfor`templatestructFoo'foo.

c++ - 为什么 ld 链接器允许使用相同的方法定义多个类?

考虑这个文件,first.cpp,包含一个类定义和使用:#includestructFoo{Foo(){std::cout和另一个second.cpp,包含一个冲突的类定义:#includestructFoo{Foo();~Foo();};Foo::~Foo(){std::cout当定义了两个具有相同名称的函数时,链接器会提示重复符号,但这些具有重复类方法的文件编译时没有错误。我用这些命令编译:$g++-csecond.cpp-osecond$g++secondfirst.cpp-ofirst对第二个g++调用的参数重新排序不会更改输出。当first运行时,这是输出:$./firstF

c++ - 需要一些清晰的模板实现代码

我正在开发一个带有一些模板类和方法(几乎只有模板)的C++库。我想拆分声明和实现以便于阅读。但有时它会变得很疯狂:templateclassFoo{templateclassSubFoo{};templateSubFoobar();};templatetemplateFoo::SubFooFoo::bar(){}这是一个非常小的例子......所以如果你有一些别名来改进这个,或者任何编码风格指南。我正在使用NeoVim,所以如果你知道一些可以让生活更轻松的插件,那也很好。Ps:我没有任何c++限制事实上,我忘记了C++中存在一些基本的东西,比如宏。#defineClassFootemp

c++ - 跨内核线程迁移后是否可以强制重新加载 thread_local 变量?

我在内核和线程之上实现用户线程并观察到,当用户线程在内核线程之间迁移时,thread_local变量会从先前的内核位置读取,即使变量也被标记作为volatile。由于编译器仅将用户级swapcontext视为函数调用,因此下面的示例演示了简单函数调用的问题。#includestructFoo{intx;inty;};__threadFoo*volatilefoo;voidbar(){asm("nop");}voidf(){foo->x=5;bar();asmvolatile("":::"memory");//Wedesireasecondcomputationoftheaddresso

c++ - 单例类找不到 ctor 但编译、运行并使实例未初始化

我在MSVC++17版本15.5.5中实现单例模式时遇到问题。我正在编译标志/std:c++17.我的实现包含以下辅助类:#pragmaonce#includetemplateclassSingleton:privateT{public:virtual~Singleton()=default;templatestaticT&initInstance(Targs&&...args){assert(instance==nullptr);instance=newSingleton(std::forward(args)...);//TheconstructorofTmightbeinacces

c++ - C/ObjC - 参数大小。使用指针与值

在什么时候我应该在我的函数/方法中传递一个指向数据的指针,而不是仅仅传递值?显然,在某些情况下我希望函数对给定数据进行操作,但如果我只是为了信息/复制目的传递值怎么办?例如,foo作为基本类型:voidsetFoo(intfoo);...intfoo=1;setFoo(foo);现在foo作为一个简单的结构:typedefstruct{intx;inty;}Foo;voidsetFoo(Foofoo);...Foofoo={1,2};setFoo(foo);//ApplecodedoesthiskindofthingwithCGSize,CGPoint...但是如果foo是一个更大的结

c++ - ctypes 类成员访问段错误

我有兴趣在Python中使用C++类。看着CallingC/C++frompython?,我决定尝试ctypes。但是,当我尝试更改类成员的值时出现段错误。这是一个重现我的问题的简单示例:C/C++方面:#includeclassFoo{private:intmValue;public:voidbar(){std::coutbar();}voidFoo_setValue(Foo*foo,intv){foo->setValue(v);}voidFoo_setValue2(Foo*foo){foo->setValue2();}}代码在OSX上编译:g++-c-fPICfoo.cpp-ofo

c++ - Doxygen `@code` block 中的链接有时会丢失

我注意到当默认构造函数不带参数时,Doxygen可以链接来自实例的成员函数调用,但当构造函数带参数时无法链接它们。这是为什么?是否有在@code/@endcodeblock中手动添加链接的解决方法?在下面的例子中:t.foo()-foo()已链接u.foo()-foo()未链接./**@filedoxy.cpp*//**structT*/structT{/**foo*/voidfoo(){}};/**structU*/structU{inta;/** 最佳答案 我认为这是Doxygen中已知问题的征兆。来自http://www.do