草庐IT

c++ - 用于检测 BMI2 指令集的编译器宏

我在网上搜索以找到合适的解决方案,但没有太大的成功。所以我希望你们中的一个人对此有所了解:有什么方法可以检测“IntelBitManipulationInstructionSets2”(BMI2)编译时间吗?我想根据它的可用性做一些有条件的事情。 最佳答案 使用GCC,您可以检查__BMI2__宏。如果目标支持BMI2(例如-mbmi2、-march=haswell),将定义此宏。这是内部函数的header(x86intrin.h、bmi2intrin.h)用于在编译时检查BMI2的宏。对于运行时检查,__builtin_cpu_i

c++ - c++0x 元组是否使用新的可变参数模板或 Boost 的宏元组实现?

我读到它基于Boost的版本,但我不太确定具体到实现时这意味着什么。我知道Boost有自己的可变参数模板,但我认为c++0x会为新元组使用它自己的可变参数模板。 最佳答案 C++0x标准草案中的tuple使用C++0x可变参数模板。它被声明为(§20.4.1):templateclasstuple;但是请注意,TR1语言扩展还包括tuple,它不使用可变参数模板,因为在编写TR1时没有这样的东西。在TR1中,tuple声明为(§6.1):templateclasstuple;其中M是一些实现定义的值,应该至少为10。TR1并不是C+

C++/Qt Q_OBJECT宏导致错误

我刚刚开始使用Qt框架进行编程。下面是一个非常简单的程序:#include#includeclassMyClass:publicQObject{Q_OBJECTpublic:MyClass(){}};intmain(intargc,char*argv[]){QCoreApplicationa(argc,argv);MyClass*c=newMyClass();returna.exec();}但是当我尝试编译和运行它时收到以下错误:在函数MyClass中:对MyClass的vtable的undefinedreference但是当我删除QObject宏时,一切正常。请注意,该类定义在与主函

c++ - C/C++ 条件宏组合

我可以在为C或C++编写代码时组合宏吗?如果不是,为什么?如果是,如何?我对如何解决以下(不正确且未编译!!!)想法很感兴趣:#defineFREE(x)if((x)){\#ifdefMEM_DEBUG_\fprintf(stderr,"free:%p(%s:%d)\n",(x),__FILE__,__LINE__);\#endif\free((x));}所以,我想要实现的是:我想定义宏FREE,如果我定义了MEM_DEBUG,它将包含一个额外的行。我知道,为了解决这个问题,我可以根据MEM_DEBUG为FREE定义两个定义,例如:#ifdefMEM_DEBUG#defineFREE(

c++ - #error inside of#define - 可能在 C++ 中(如果未定义某些常量,则在调用宏 MyMacro 时生成错误)?

我想定义宏,它基于某些条件(#defineINITED的存在,而不是宏的参数)将返回值,或生成编译器错误,例如:#errorNotinitialized!我试过(对于myIdea.h):#ifdefINITED#defineMyMacro(x)x->method();//somethingwithx#else#defineMyMacro(x)#errorNotinitalized!#endif但是该代码会生成错误(不是我想要的那个)预期的宏格式参数。请注意,我不想要该代码(工作,但做了一些不同的事情):#ifdefINITED#defineMyMacro(x)x->method();/

c++ - 如何编写安全且用户友好的 c/c++ #define 宏

我一直在思考如何编写安全、可读和直观的宏。正确使用它们应该通过它们的外观来理解,如果使用不当,编译器应该告诉你,而不是让你引入一个模糊的错误。在编写多行定义宏时,我通常会发现自己是这样构造它们以满足所需条件的:#definemacro(x)do{\...somecodeline;\...somecodeline;\}while(0)这样你就可以...if(a){macro(a);}和...if(a)macro(a);else{...}一个很好的特性是,如果你不正确地使用它们,你会得到一个编译器错误。这不会编译例如:if(a)macro(a)elseb();但是,我看到SW开发人员阅读了

c++ - C/C++ 中的函数调用宏

关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭7年前。Improvethisquestion如果一个函数,比如foo(),在各种平台上以不同的方式被调用,使用宏是不是不好的做法?例如:#ifdefWIN32#defineffoo(a)foo(0)#else#defineffoo(a)foo(a)#endif

c++ - 跨平台代码标签宏?

在MSVC&C#中,#pragmaregion可以用来标记一段代码。同样,在GCC/Clang中,#pragmamark可以完成同样的事情。是否可以定义一个宏,例如CODELABEL(label),它适用于两种编译器?基本上,我想避免必须执行以下操作:#ifdef_WIN32#pragmaregionVariables#else#pragmamarkVariables#endifboolMyBool;intMyInt;#ifdef_WIN32#pragmaregionMethods#else#pragmamarkMethods#endifvoidMyMethod();voidAnoth

c++ - 为什么在定义宏 ## 操作时有 2 层间接寻址

在下面的宏定义中,在真正的粘贴操作之前有两层间接:#defineMACRO_JOIN(a,b)MACRO_JOIN1(a,b)#defineMACRO_JOIN1(a,b)MACRO_JOIN2(a,b)#defineMACRO_JOIN2(a,b)a##b我知道我们需要MACRO_JOIN1,因为它没有粘贴或字符串化,所以它的参数可以先展开。但是第二个间接寻址MACRO_JOIN的目的到底是什么?在什么情况下MACRO_JOIN可以工作但MACRO_JOIN1会失败? 最佳答案 强制进行额外的扩展可能会有所不同,因为初始扩展会导致

c++ - 用于创建结构的可变参数宏

我怎样才能写一个像这样使用的宏(用于gcc):CREATE_STRUCT(my_struct1,foo);CREATE_STRUCT(my_struct2,foo,bar);并扩展为structmy_struct1{std::stringfoo;};structmy_struct2{std::stringfoo;std::stringbar;};?我当然需要不同数量的成员的灵active,但对我来说已经很少了(大约4或5)。我发现了几个相关的问题,例如this和this,但是当我试图对这个问题应用这种神秘的宏魔法时,我完全迷失了。PS:我知道如何编写5个宏(每个参数一个)来完成这项工作