草庐IT

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 语言函数宏封装妙招

1.函数宏介绍函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销。函数宏本质上为宏,可以直接进行定义,例如:#defineINT_SWAP(a,b)\inttmp=a;\a=b;\b=tmp但上述的宏具有一个明显的缺点:当遇到 if、while 等语句且不使用花括号仅调用宏时,实际作用范围在宏的第一个分号后便结束。即 a=b 和 b=tmp 均不受控制语句所作用。因此,在工程中,一般使用三种方式来对函数宏进行封装,分别为 {}、do{...}while(0) 和 ({})。下文将一一对三种方式进行分析,比较各自的优劣点。2.{

c++ - 为什么使用 do { ... } while (FALSE);在宏之外的 C++ 中

这个问题在这里已经有了答案:关闭11年前。PossibleDuplicate:Aredo-while-falseloopscommon?是否有理由使用如下代码:do{//alotofcodethatonlyneedstoberunonce}while(FALSE);当代码没有定义宏时?我知道在涉及宏时这是一个技巧,但在普通代码中有它的原因吗?

c++ - 如何对传递给可变参数宏的可变参数求和?

我想要一个程序,它定义了一个可以计算参数数量并将它们传递给函数sum的宏,该函数对参数值求和并返回总数。我设法在GCC上做到了,但我想在VisualC++14上实现它。#include"stdafx.h"#include#include#defineELEVENTH_ARGUMENT(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,...)a11#defineCOUNT_ARGUMENTS(...)ELEVENTH_ARGUMENT(dummy,##__VA_ARGS__,9,8,7,6,5,4,3,2,1,0)#defineSUM(...)sum(ELEVENT

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

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

C++ 代码和 C 版本宏

预计这是一个过于具体的问题。那可能是因为我缺乏一些我无法通过谷歌搜索找到的基本知识。如果更有意义,请随意回答问题的更一般版本。给定一些C++代码,我想知道它的特定标准版本和它的C标准版本(如果有的话)是否(以及如何)相关。我已经验证了这个测试代码#includeintmain(void){printf("%ld\n",_POSIX_C_SOURCE);return0;}使用“g++-std=c++98”、“g++-std=c++11”、“clang++-std=c++98”、“clang++-std=”中的任何一个编译时打印“200809”C++11”。(当我使用任何明确的标准版本编译

C++ 预处理器删除可变参数宏调用中的空格 (Solaris Studio 12.3)

OracleSolarisStudio12.3的C++预处理器在扩展__VA_ARGS__时完全删除了空格。任何人都可以在他们的系统上确认这种行为吗?这是一个已知的编译器错误吗?这个问题有什么解决方法吗?为了说明,这里有一个简单的测试程序,vaargs.c:#include#definePRINT(...)printf("%s\n",#__VA_ARGS__)intmain(){PRINT(helloworld);return0;}C预处理器按预期工作:$ccvaargs.c-ovaargs&&./vaargshelloworld$cc-Vcc:SunC5.12SunOS_i38620

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++模板元编程功夫挑战(替换一个宏函数定义)

情况我想实现复合模式:classAnimal{public:virtualvoidRun()=0;virtualvoidEat(conststd::string&food)=0;virtual~Animal(){}};classHuman:publicAnimal{public:voidRun(){std::cout::iteratori=animals.begin();i!=animals.end();++i){(*i)->Run();}}//It'snotDRY.yuck!voidEat(conststd::string&food){for(std::vector::iterato