草庐IT

c++ - 什么是 __pragma 以及 __pragma 和 #pragma 之间的区别是什么

下面的宏让我很困惑。我想知道什么是__pragma以及__pragma和#pragma之间的区别。#defineOPENVDB_START_THREADSAFE_STATIC_WRITE__pragma(warning(disable:1711))#defineOPENVDB_FINISH_THREADSAFE_STATIC_WRITE__pragma(warning(default:1711)) 最佳答案 #pragma本身就是一个预处理器指令;它不能在#define指令中使用。因此,这就是__pragma存在的原因:它提供了一种

c++ - 将 defined(X) 返回为 true 或 false 的宏

我想要一系列宏来替换下面的代码#ifdefFOOreturntrue;#elsereturnfalse;#endif用类似的东西returnMAGICLY_EXPANDING_IFDEFINED_MACRO(FOO);您可以猜到,有很多FOO,足以将4行缩减为1行会很酷。但实际上它会用一行替换一个怪物switch语句。 最佳答案 在C++中,defined的行为仅针对条件包含(#if和#elif)指定。所以你不能以任何其他方式使用它。(相关规则见标准16.1节)但是,如果你想检测具体是#define到空字符串的宏,你不需要defin

c++ - 在 C++ 中将函数实现为宏的优点/缺点

将业务逻辑函数实现为宏是个好主意吗?我继承了一些遗留的C++代码,我发现很多业务逻辑函数都是作为长而神秘的宏实现的。宏比函数有优势吗?使用宏背后的一般原理是什么?哪种逻辑最适合宏?这是一个简单的代码示例#defineINSERT_VALUES(IN,ID,EO){\doubleevaluationOutput=EO;\intcontrols=0;\intinput_controls=m_input_controls[IN];\if(m_value_list[IN].ShouldProcess())\{\evaluationOutput=m_evaluationOutput[IN];\c

c++ - 使用 __LINE__ 获取代码行

我尝试使用以下方法打印当前代码的行号:#includevoiderr(char*msg){printf("%s:%d",msg,__LINE__);}intmain(intargc,char**argv){ERR("fail..");return0;}但我总是得到错误的行号,它应该是10而不是5,我该如何解决这个问题?我还尝试使用一些宏:#defineERR(msg)do{printf("%s:%d\n",msg,__LINE__);}而(0)并导致错误:msgnotdeclared 最佳答案 __LINE__将为您提供它出现的行,

c++ - 如何在结构/类中获取有关 "current type"的信息?

是否有可能在struct中获取“当前struct的类型”?例如,我想做这样的事情:structfoobar{intx,y;booloperator==(constTHIS_TYPE&other)const/*WhatshouldIputhereinsteadofTHIS_TYPE?*/{returnx==other.x&&y==other.y;}}我试过这样做:structfoobar{intx,y;templatebooloperator==(constT&t)const{decltype(*this)&other=t;/*Wecanuse`this`here,sowecanget"

c++ - 通过宏安全地传递模板参数逗号?

我目前正在使用宏来更简洁地声明相对较长的部分专用模板类列表。以下是一些过于简化的示例:#defineINSTANTIATE_MYTYPE(freeargs,specialization,myvalue)\template\structMyType{staticconstboolvalue=myvalue;}如果我在每种情况下都没有要传递的逗号,这就可以正常工作:INSTANTIATE_MYTYPE(typenameT,std::vector,true);如果我有逗号通过单级宏扩展,它有一个可以容忍的解决方法:#defineMacroComma,INSTANTIATE_MYTYPE(ty

c++ - 从函数内部获取函数名称和参数值的宏

我正在开发一个调试/日志程序,想知道是否可以创建一个宏,我可以将其粘贴到每个函数中,并且它会在每次调用函数时打印函数名称和参数值。函数名可以在编译时解析,问题是如何打印参数值?更新:我记得读过一篇获取参数的文章,但其中涉及汇编代码和操作堆栈指针,这不是跨平台兼容的——这是我需要的。 最佳答案 您可以使用__FUNCTION__或__func__宏作为函数名称。对于参数,我认为没有内置的宏来实现这一点。其他有用的宏是__LINE__和__FILE__。编辑:__FUNCTION__和__func__不是标准的一部分,但它们受到广泛支持

c++ - C/C++ 中可中断的命名范围

介绍这个问题来自这个问题:Thenamedloopidiom:dangerous?.对于不想阅读原始问题的人来说,这是关于做这样的事情:named(label1)for(inti=0;i这个新问题是关于“命名循环”习语的改进版本。如果你懒得阅读整篇文章,你可以直接进入这篇文章的“示例”部分,清楚地理解我在说什么。设计缺陷不幸的是,这个问题很快就结束了(后来又重新打开了),因为它更像是一个利弊辩论,而不是一个纯粹的技术问题。似乎它不适合SOQ&A格式。此外,我提供的代码有几个缺陷:关键词break由宏重新定义宏是用小写字母写的它使一些可怕的东西可以编译(至少使用MSVC):intfoo(

c++ - 减少 C++(或 x-treme x-macros)中的代码重复

我在为游戏实现Lua接口(interface)时使用x-macros来减少重复和代码重复的数量Bitfighter.以下代码工作正常://FnnameValidparamprofilesProfilecount#defineTELEPORTER_LUA_METHOD_TABLE\TELEPORTER_LUA_METHOD_ITEM(addDest,ARRAYDEF({{PT,END}}),1)\TELEPORTER_LUA_METHOD_ITEM(delDest,ARRAYDEF({{INT,END}}),1)\TELEPORTER_LUA_METHOD_ITEM(clearDests

c++ - 使用宏创建 QObject 派生类

我正在尝试简化(即摆脱大量样板代码)QObject包装类的创建,这些包装类转发其他QObject派生类的属性访问。从小处着手,我只是尝试使用一个属性://Sy_test.h-ThewrappedclassclassSy_test:publicQObject{Q_OBJECTQ_PROPERTY(boolpropREADgetPropWRITEsetPropNOTIFYpropChanged)public:Sy_test(QObject*parent=nullptr):QObject{parent},prop_{false}{}boolgetProp()const{returnprop_