草庐IT

[Rust笔记] 规则宏的“卫生保健”

规则宏代码的“卫生保健”规则宏mbe即是由macro_rules!宏所定义的宏。它的英文全称是MacroByExample。相比近乎“徒手攀岩”的Cpp模板·元编程,rustc提供了有限的编译时宏代码检查功能(名曰:MixedHygiene宏的混合保健)。因为rust宏代码·被展开于·编译过程中的语法分析阶段(请见下图),所以rustc相较于g++/gcc拥有更多可用作“代码静态分析”的信息。宏代码验证功能的有限性体现在rustc仅只对·宏展开式·内的本地变量标签当前包引用执行编译时检查。咦!“宏展开式”是什么概念?这是一个好问题。在我们开始更深入的讨论之前,有必要先对几个名词解释达成一致的理

c++ - 算术表达式上下文中的宏扩展?

我在一个网站上看到了下面的代码。我无法理解结果是如何作为11而不是25或13的。为什么我想25因为SQ(5)5*5或13因为SQ(2)=4;SQ(3)=9;可能最终结果将是13(9+4)但惊讶地看到结果为11。结果如何变成11?usingnamespacestd;#defineSQ(a)(a*a)intmain(){intans=SQ(2+3);cout 最佳答案 预处理器对源代码进行简单的文本替换。它对底层语言或其规则一无所知。在您的示例中,SQ(2+3)扩展为(2+3*2+3),计算结果为11.定义SQ的更稳健的方法是:#def

c++ - 是否可以在 C++11 中编写宏 existenceof(S,f) 或 hasfield(S,f)?

我相当熟悉不涉及宏魔术的标准元编程解决方案(例如C++11waysoffindingifatypehasmemberfunctionorsupportsoperator?)。但是,我有一个涉及以下便利宏的用例(当然,为StackOverflow大大简化了,但想象一下这是用于序列化或其他东西)...#defineSTART(type)do{typedeftypecurrent;constchartypeName[]=#type#defineOUTPUT(fieldname)\printf("typeof%s.%sis%s\n",#type,#fieldname,\std::is_same

c++ - 其可变参数没有参数的可变参数宏

在不为其可变参数设置参数的情况下调用可变参数宏M是否合法?相关的标准引用是[cpp.replace]/4:Iftheidentifier-listinthemacrodefinitiondoesnotendwithanellipsis,thenumberofarguments(includingthoseargumentsconsistingofnopreprocessingtokens)inaninvocationofafunction-likemacroshallequalthenumberofparametersinthemacrodefinition.Otherwise,the

c++ - 没有宏的更快的常量字符串附加

所以在组合字符串的时候,往往会有常量成分,例如:std::strings;s+=initial_string;s+="conststring";s+=terminating_string;这只是一个演示,字符串操作可能会更加复杂和深入。因此,在执行const部分时,实现最终“不知道”长度并有效地执行strlen()。在上面。显然这是一种浪费,因为长度在编译时是已知的。我已经测试过,用这个替换const字符串部分要快得多(无论出于何种原因,在x64中都要快得多):s.append("conststring",12);实际统计字符数很烦人,耗时且容易出错,所以这个稍微好一点:s.appen

c++ - 如何使用这个宏来测试内存是否对齐?

我是simd初学者,我读过this有关该主题的文章(因为我使用的是兼容AVX2的机器)。现在,我读到了this检查您的指针是否对齐的问题。我正在用这个玩具示例main.cpp测试它:#include#include#defineis_aligned(POINTER,BYTE_COUNT)\(((uintptr_t)(constvoid*)(POINTER))%(BYTE_COUNT)==0)intmain(){floata[8];for(inti=0;i并用icpc-std=c++11-omainmain.cpp编译它。结果打印是:1111但是,如果我在4个打印之前添加这3行:for(

c++ - 调用可变参数宏的可变参数函数

我有一个内联可变参数函数内联intfoo(...)我需要foo()来调用一个宏(我们称它为MACRO),它也是可变的。基本上,我需要foo()将其所有输入参数传递给MACRO。由于__VA_ARGS__选项,将foo()重新定义为另一个宏将是一个简单的解决方案,但我还需要foo()返回一个值。注意:我正在尝试连接已经编写的代码的两个部分,并且不允许更改它们。foo(...)用于代码的第一部分,MACRO在第二部分定义。我唯一应该做的就是定义一个使用MACRO的foo()而我不能,因为它们都是可变的。 最佳答案 将foo设为包含返回值

c++ - 在 Xcode [c++] 中的 assert (assert.h) 中定义 lambda 时,为类似函数的宏调用编译错误提供了太多参数

我正在使用assert.h中的断言宏我已经定义了lambda来执行断言检查。intval1=0;intval2=1;constautocheck=[val1,val2]()->bool{returnval1bool{returnval1//compileerrorforthiscall"toomanyargumentsprovidedtofunction-likemacroinvocation"assert([val1,val2]()->bool{returnval1为什么会这样toomanyargumentsprovidedtofunction-likemacroinvocation

c++ - MSVC 的 _M_X64 预定义宏说明

MSVC'sPredefinedMacros的文档状态“_M_X64[is]为x64处理器定义。”这到底是什么意思?是否会被定义:当我为x64处理器构建时,或者当我使用x64处理器构建时?具体来说,我正在为前一种情况寻找编译器开关,而不是后者。_M_X64是否足以满足该目的? 最佳答案 表示_M_X64是目标处理器。这是您构建的目的,而不是构建的基础。 关于c++-MSVC的_M_X64预定义宏说明,我们在StackOverflow上找到一个类似的问题: ht

c++ - 如何让预处理器在宏扩展结果中插入换行符?

这个问题在这里已经有了答案:Howtogenerateanewlineinacppmacro?(8个答案)关闭7年前。使用C/C++宏可以很容易地自动生成长结构。例如,如果我希望大量的方法永远不会抛出异常(这是公开COM的方法所必需的),我可以这样做:#defineBEGIN_COM_METHOD\try{#defineEND_COM_METHOD\returnS_OK;\}catch(exception&){\//setIErrorInfohere\returnE_FAIL;\}为了使此类宏易于管理,可以使用“\”字符使宏定义多行且更具可读性。问题是有时具有此类结构的代码无法编译-有