草庐IT

C++宏将字符串转换为字符列表

是否可以有一个宏:CHAR_LIST(鸡肉)扩展到:'c','h','i','c','k','e','n'[我想要它的原因:因为即使对于中等大小的字符串,宏也比手动扩展方便得多。我需要扩展的原因是将字符串传递给可变模板] 最佳答案 回答者更新,2015年7月:由于上面对问题本身的评论,我们可以看出真正的问题不是关于宏本身。提问者想要解决的真正问题是能够将文字字符串传递给接受一系列字符作为非类型模板参数的模板。这是一个ideone该问题的解决方案演示。那里的实现需要C++14,但很容易将其转换为C++11。------------我想

c++ - 如何使用c宏生成函数名

宏“VER”在其他一些我无法更改的头文件中被定义为“((u_long)1)”。在我的代码中,我需要使用“test”和VER组合函数“test_1”。但是编译器报告错误,因为它是“test_((u_long)1)”而不是“test_1”生成的。我的问题是:如何编写宏来生成“test_1”?提前致谢!#defineVER((u_long)1)/*ThisisdefinedinsomeotherheaderfilewhichIcan'tchange*/#definepaste(x,y,z)x##y##z#definepaste2(x,y,z)paste(x,y,z)#definefcall(

c++ - 支持逗号和错误信息的自定义 `assert`宏

我想创建一个自定义版本的assert中定义的宏,当断言失败时显示错误消息。所需的用法:custom_assert(AClass::aBoolMethod(),"aBoolMethodmustbetrue");有缺陷的测试实现:#definecustom_assert(mCondition,mMessage)...//ThisfailsbecausemConditionmayhavecommasinit#definecustom_assert(...,mMessage)//Notsureaboutthiseither-mMessagemaybeanexpressioncontaining

c++ - 为什么字符串连接宏不适用于这个 "+"案例?

小问题:是否允许为字符串连接宏##连接特殊符号,例如+、-?例如,#defineOP(var)operator##varOP(+)会扩展为operator+吗?具体问题:#include"z3++.h"#includenamespacez3{z3::exproperator+(z3::exprconst&,z3::exprconst&);}typedefz3::expr(*MyOperatorTy)(z3::exprconst&,z3::exprconst&);#defineSTR(var)#var#definez3Op(var)static_cast(&z3::operator##v

c++ - #ifdef _DEBUG 在主函数中

如果我在visualstudio2013上工作,main函数中的#ifdef_DEBUG是否有意义?如果是,它的用途是什么?int_tmain(intargc,_TCHAR*argv[]){#ifdef_DEBUG//creatingsomeobjects,usingfunctionsetc;#endif} 最佳答案 #ifdefDEBUG或#ifdef_DEBUG用于处理您用于调试目的的一些代码。如果添加#undef_DEBUG或在代码的最开头与此类似,编译器将跳过#ifdefDEBUG/*blabla*/#endif中包含的代码

c++ - 用于在 auto_ptr 和 unique_ptr 之间切换的宏

在一个仍然使用C++11之前版本的项目中,我想通过使用C++11编译器进行编译并修复错误来为切换准备源代码。它们包括std::auto_ptr的实例替换为std::unique_ptr必要时,用std::move()包裹智能指针一些0和NULL替换为nullptr现在我想切换回C++之前的编译器并编写一个可以切换回更改的宏,这样,当最后的编译器切换时间到了时,我只需删除宏。我试过了#ifndefHAVE_CXX11#definenullptrNULLnamespacestd{#defineunique_ptrauto_ptr}#endif(使用exvector与智能指针一起使用的示例类

C++ 宏有条件地编译代码?

我想根据宏有条件地编译代码。基本上我有一个看起来像的宏(从真实版本简化而来):#ifDEBUG#defineSTART_BLOCK(x)if(DebugVar(#x)\{chardebugBuf[8192];#defineEND_BLOCK()printf("%s\n",debugBuf);}#else#defineSTART_BLOCK(x)(void)0;#defineEND_BLOCK()(void)0;#endif问题是,如果定义了DEBUG,您可以执行以下操作:START_BLOCK(test)charstr[]="Testisdefined";strcpy(debugBuf

c++ - 有没有跨平台的方法来检测 Debug模式编译?

是否有跨平台的方法来检测Debug模式编译?如果没有,那么顶级编译器如何做;MSVC、GNU和MINGW、mac、clang、intel。例如MSVC,您可以像下面这样检测Debug模式。#ifdefined_DEBUG//debugrelatedstuffhere#else//releaserelatedstuffhere#endif 最佳答案 对于许多或大多数编译器来说,“调试”模式是一个多方面的概念,包括几个正交设置。例如,对于gcc,您可以使用-g将调试符号添加到输出代码,使用-O启用优化,或禁用assert()宏使用-DN

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();/