草庐IT

packed-switch

全部标签

c++ - 高效的switch语句

在下面两个版本的switchcase中,我想知道哪个版本是高效的。1:string*convertToString(inti){switch(i){case1:returnnewstring("one");case2:returnnewstring("two");case3:returnnewstring("three");..default:returnnewstring("error");}}2:string*convertToString(inti){string*intAsString;switch(i){case1:intAsString=newstring("one");b

c++ - 如果 switch case 失败,我如何让 MSVC 发出警告或失败?

如果我的一个switch语句有一个不中断的情况,我想得到一个警告/错误。这可能吗?switch(i){case1:cout在goingnative2012session上讨论了类似的Clang功能,但我需要它用于MSVC2013http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Clang-Defending-C-from-Murphy-s-Million-Monkeys理想情况下,当两个连续的主体没有被中断分开时,我会想要一个警告,这样上面的例子就会失败,但这不会:switch(i){case1:cout

c++ - C++ switch 仅适用于整数类型的基本原理是什么?

这个问题在这里已经有了答案:Whycan'ttheswitchstatementbeappliedtostrings?(22个答案)关闭7年前。我觉得C++应该允许switch()处理任何可以比较的类型,而不仅仅是整数类型。这似乎很奇怪:switch(myEnum){casemyEnumValue1:...break;casemyEnumValue1:...break;}在语义上等同于:if(myEnum==myEnumValue1)...elseif(myEnum==myEnumValue2)...但这只适用于整数类型。为什么?这样限制的目的是什么?我知道编译器为switch生成的代

c++ - 优化 switch 语句时出现 Visual Studio 2005 C 编译器问题

其他人可能感兴趣的一般问题:据我所知,我遇到了一个带有switch语句的C++编译器优化(VisualStudio2005)问题。我想知道的是,是否有任何方法可以满足我的好奇心并找出编译器正在尝试但未能做到的事情。有没有我可以花一些时间(可能太多时间)破译的日志?我的具体问题对于那些足够好奇并继续阅读的人-我想听听您对我在这个具体案例中遇到问题的原因的看法。我有一个包含switch语句的大约500行代码的小程序。它的一些情况包含一些指针赋值。double*ptx,*pty,*ptz;double**ppt=newdouble*[3];//somecodeinitializingetcp

c++ - 使用省略号的回退函数 : can we force the size of the parameters pack?

考虑以下代码:#include#includestructS{templateautof(A&&...args)->decltype(std::declval().f(std::forward(args)...),void()){std::coutvoidf(...){std::cout(42);//->hasf(int)s.f(42);//->hasnotf(int)//oopss.f();//->hasnotf(int)}如示例所示,对f的第三次调用工作正常,即使参数数量错误,因为对于回退函数来说它根本没有错.当以这种方式涉及省略号时,有没有办法强制参数的数量?我的意思是,我可以在

c++ - gcc 与 clang : expanding a captured parameter pack twice

考虑这个代码片段:intmain(){autofirst=[&](auto...one){autofaulty=[&](){[[maybe_unused]]autoi=(one+...);return(one+...);};faulty();};first(1);}另见ongodbolt.似乎当我尝试在内部lambda中将隐式捕获的参数包one扩展两次时,gcc会提示,但clang不会。请注意,当我明确捕获时,例如[&one...],gcc不再提示。对我来说,这看起来像是一个gcc错误,但我想得到比我更有经验的人的一些确认,因为我已经在带有可变捕获的clang中看到(不同的)错误行为h

c++ - 警告 LNK4099 : PDB 'vc80.pdb' was not found after switching to vista

在从我的旧XP移动到新的vistaPC后,我在VS2005中的一个旧项目中收到以下几个警告:UnitTest++.vsnet2005.lib(TestRunner.obj):警告LNK4099:PDB'vc80.pdb'wasnotfoundwith'c:\projects\blah.lib'orat'c:\projects\blah\debug\vc80.pdb';链接对象就好像没有调试信息一样我知道可以忽略此警告,但我不喜欢警告。这些警告都与我静态链接到的第三方库(UnitTest++)有关。我看不出这与vista有什么关系,但是两台PC在构建后的相同位置都有相同数量的vc80.p

c++ - 如何防止 MSVC++ 为 switch 语句过度分配堆栈空间?

作为遗留代码库更新工具链的一部分,我们希望从BorlandC++5.02编译器转移到Microsoft编译器(VS2008或更高版本)。这是一个嵌入式环境,其中堆栈地址空间是预定义的并且相当有限。事实证明,我们有一个带有大量switch语句的函数,这会导致在MS编译器下比在Borland下分配更大的堆栈分配,实际上会导致堆栈溢出。代码的形式是这样的:#ifdefPKTS#defineRETURN_TYPESPackettypedefstruct{inta;intb;intc;intd;inte;intf;}SPacket;SPacketerror={0,0,0,0,0,0};#else

c++ - 关于 __attribute__((__packed__)) 的 c++ 编译错误还有哪些其他方法?

当我编译以下代码时:#include#includestructTupleHeader{timevaltuple_stime;//34..37}__attribute__((__packed__));voidset_value(timeval&stime){}intmain(){TupleHeadertuple;set_value(tuple.tuple_stime);return0;}我得到了g++-3.4.2下的错误和g++-4.8.3:attribute-1.cc:Infunction`intmain()':attribute-1.cc:13:error:cannotbindpa

c++ - clang compaining about __attribute__((packed)) 即使结构需要打包

我有一个结构,需要打包(不打包大小为20个字节,但我需要16个才能读/写它)。当我添加packed属性时,我得到了结构的所有成员的error:packedattributeisunnecessaryfor警告。当使用pragma消除错误时,代码可以正常编译并且结构的大小为16,但是如果我删除pragma,它就会失败(因为我使用的是-Werror)。clang只是错误地发出了这个警告还是我做错了什么?#includetypedefstruct__attribute__((packed)){uint16_twFormatTag;uint16_tnChannels;uint32_tnSamp