草庐IT

c++ - 在 C++ 中使用 DEBUG 宏的原因是什么?

我正在研究其他人构建的C++程序,并且看到了很多这样的DEBUG用法#ifdefDEBUGcout我本人仍在学习成为一名富裕的C++程序员的过程中,我主要使用VisualStudio和断点进行调试。所以我想知道,如果我能够单步执行代码来调试值,还有其他理由使用这些宏吗?尝试用谷歌搜索但没有找到太多有用的页面。谢谢。 最佳答案 有时您不想单步执行整个代码,而只是检查终端中的输出。如果代码是在定义了DEBUG的情况下编译的,可能在调试构建中,您会看到输出。对于发布版本,您不需要。如果您转到项目设置->配置属性->C/C++->预处理器-

c++ - C 预处理器和操作顺序

我正在学习C,但我不明白:#definesquare(x)x*xa=square(2+3)//a=11运行时,为什么a最终变成了11? 最佳答案 展开为2+3*2+3,相当于2+(3*2)+3。使用括号来修复它:#definesquare(x)((x)*(x))现在用square(x++)试试,你会遇到更多问题(未定义的行为)。如果可以,请避免将此作为宏执行。 关于c++-C预处理器和操作顺序,我们在StackOverflow上找到一个类似的问题: https

c++ - 我可以将此宏更改为内联函数而不影响性能吗?

(编辑:让我们将其命名为“测量如何出错的教训。”但我仍然没有弄清楚究竟是什么导致了差异。)我发现了一个非常快的整数平方根函数here通过马克·克朗。至少在我的机器上使用GCC,它显然是我测试过的最快的整数平方根函数(包括Hacker'sDelight、thispage和标准库中的floor(sqrt())中的函数)。稍微清理一下格式、重命名变量并使用固定宽度类型后,它看起来像这样:staticuint32_tmcrowne_isqrt(uint32_tval){uint32_ttemp,root=0;if(val>=0x40000000){root=0x8000;val-=0x4000

c++ - BOOST_BINARY 宏如何解析空格?

考虑以下代码。intvalue1=BOOST_BINARY(100111000011110);有人可以解释一下BOOST_BINARY如何计算那里的int值吗? 最佳答案 这非常非常复杂。这个BOOST库使用由其他宏构造的宏。我将向您展示一些预处理器编程的简化示例:简化的问题:如何让宏在rest的开头添加0或1-就像这个例子:CAT(01)-->01CAT(1100)-->1100所以-不知何故,必须按顺序将两个参数放在它们之间。好吧,我这样做了://startpoint-thisisourdesiredformat#defineC

c++ - 在创建 C++ 枚举和依赖数据结构时如何避免重复自己?

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Enumtostring:returntheenumintegervalueifinvalid/notfound简而言之,我的(工作)定义代码是这样的:enumGadget{First,Second,};constchar*gadget_debug_names[]={"First","Second",//note:stringsaresameasenumtokenshere,butbonuspointsif//theycanoptionallybegivendifferentvalues};但是,如果信息位于

c++ - C/C++预处理器宏可以有默认参数值吗?

这个问题在这里已经有了答案:OptionalParameterswithC++Macros(15个答案)OverloadingMacroonNumberofArguments(10个答案)关闭7年前。我们可以为宏参数指定默认参数值吗?我知道没有任何类型检查,所以我希望默认值只不过是预处理器在未指定参数值的情况下用于宏扩展的一些文本。

c++ - 在编译时在 static_assert() 中显示整数

这是我正在尝试做的简化版本enumFirst{a,b,c,nbElementFirstEnum,};enumSecond{a,b,c,nbElementSecondEnum,};static_assert(First::nbElementFirstEnum==Second::nbElementSecondEnum,"Notthesamenumberofelementintheenums.");/*static_assert(First::nbElementFirstEnum==Second::nbElementSecondEnum,"Notthesamenumberofelementi

c++ - 如何将任意代码块作为参数传递给 C 宏

我想创建一个接受任意代码块作为其参数的宏FOR_VECTOR(type,vect,code_block)\for(vector::iteratori=vect.begin();i!=vect.end();++i){\code_block;\}问题是参数中的代码块,其中可能包含任意数量的、和)字符。有什么好的解决办法吗? 最佳答案 有许多可能的解决方案。如果您只需要一个表达式(不是完整的代码块)-您可以将它包含在(和)中FOR_VECTOR(int,v,(func(i,1)))将工作-(func(i,1))被视为单个宏参数另一个部分解

c++ - #定义空格

是否可以用空格来编写定义,例如:#definereplacetoreplacementhere我想用“replacementhere”替换“replaceto”。编辑:我想测试私有(private)成员:我确实写过#defineprivatepublic但它不适用于Qt中的私有(private)槽所以我打算使用类似的东西#defineprivateslots:publicslots:无论如何,我已经找到了另一种测试插槽的方法,顺便说一句,我知道这是一个丑陋的hack。 最佳答案 不,你不能#defineidentifiersomet

c++ - 技巧 : filling array values using macros (code generation)

AreC++TemplatesjustMacrosindisguise?我正在阅读上述主题,突然想到一个想法:为什么不尝试编写一些可以在我们的实际代码中使用的棘手宏,(不仅仅是作为在现实生活中无用的谜题)?所以首先想到的是:用宏填充数组值:intf(int&i){return++i;}#definee100r5(m20)#definem20m5,m5,m5,m5#definem5r5(e1)#definee1f(i)//avoiding++irighthere,toavoidUB!#definer5(e)e,e,e,e,eintmain(){inti=0;//thisisusedint